1.代码块的定义和使用
1.1普通代码块
1.2构造块**
1.3静态代码块**
1.4同步代码块
1.代码块的定义和使用
根据代码块出现的位置以及关键字,分为以下四种代码块
属性在使用前进行处理,可以考虑用到代码块
1.1普通代码块
定义在方法中的代码块。一般方法中代码过长,为避免变量重名,使用普通代码块。使用较少,了解概念即可
public static void main(String[] args){
//普通代码块,直接在{}中定义。
{
int a = 10;
System.out.println(a);
}
int a = 20;
System.out.println(a);
}
1.2构造块**
定义在类中的代码块(不加任何修饰符)
在对象产生时,优先于构造方法执行,有几个对象产生,就调用几次构造块。
意义:用于在构造方法执行前完成一些属性的初始化操作。(在调用构造方法前)
class Person{
{//构造块。定义在类中,不加任何修饰符。
System.out.println("Person类的构造块");
}
Person(){
System.out.println("Person类构造方法");
}
}
public class review1{
public static void main(String[] args){
new Person();
new Person();
}
}
1.3静态代码块
定义:用static定义的代码块。
根据所在的类不同分为:非主类中的静态代码块,主类中的代码块。
1.3.1非主类中的静态块 主要作用:为static属性进行初始化
class Person{
{//构造块。定义在类中,不加任何修饰符。
System.out.println("2.Person类的构造块");
}
Person(){
System.out.println("3.Person类构造方法");
}
static{ //定义在非主类中的代码块
System.out.println("4.Person类中的静态块");
}
}
public class review1{
public static void main(String[] args){
System.out.println("1.start");
new Person();
new Person();
System.out.println("5.end");
}
}
从上述代码和结果我们发现:
1.非静态代码块在类加载时执行(啥时候用到这个类),且优先于构造块执行。
2.无论产生多少个实例化对象,都只会调用一次。
1.3.2定义在主类中的静态代码块
主类中的静态块优先于主方法执行。
class Person{
{//构造块。定义在类中,不加任何修饰符。
System.out.println("2.Person类的构造块");
}
Person(){
System.out.println("3.Person类构造方法");
}
static{ //定义在非主类中的代码块
System.out.println("4.Person类中的静态块");
}
}
public class review1{
{
System.out.println("主类中的构造块");
}
review1(){
System.out.println("主类中的构造方法");
}
static{
System.out.println("主类中的静态块");
}
public static void main(String[] args){
System.out.println("1.start");
new Person();
new Person();
System.out.println("5.end");
}
}
1.4同步代码块--关于这个在多线程同步再进行讨论。
通过上述的学习,下面我们来看一个阿里的java校招笔试题:
class demo1{
{
System.out.println("2.父类构造块");
}
demo1(){
System.out.println("3.父类构造函数");
}
static{
System.out.println("4.父类静态块");
}
}
public class ali extends demo1{
{
System.out.println("5.子类构造块");
}
public ali(){
System.out.println("6.子类构造函数");
}
static{
System.out.println("7.子类静态块");
}
public static void main(String[] args){
System.out.println("1.start---");
new ali();
new ali();
System.out.println("8.end----");
}
}
我们不妨想想它的运行结果是什么?