Java 类的初始化相关问题
in Java入门小程序 with 0 comment

Java 类的初始化相关问题

in Java入门小程序 with 0 comment

类的初始化块

可以在类中使用{}将语句包围起来,直接将其作为 类的成员
类的这种“没有名字”的“成员”,多用于初始化类的字段。
QQ截图20171019205536.jpg

注:当一个类中既有初始化块儿,又有构造方法,同时还设定了字段的初始值时,谁说了算?
看这个例子:


    public class InitializeBlockDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        
        InitializeBlockClass obj=new InitializeBlockClass();
        System.out.println(obj.field);
                                                                                                                                                                                                                                                                                                                                                             
        obj=new InitializeBlockClass(300);
        System.out.println(obj.field);
    }

}

class InitializeBlockClass{
    //下面这句在初始化块之前与之后,会影响到field字段的初始值
//    public int field=100;
    
    {
        field=200;
    }
    public int field=100;
    public InitializeBlockClass(int value){
        this.field=value;
    }
    public InitializeBlockClass(){
    
    }
}

首先说明一下,这仅仅是一个示例,在实际开发中一个字段请初始化一次!
那么这个例子中的结果会是什么样子呢!
QQ截图20171019210142.jpg

解释

在这个例子中,第一次调用的是无参数的构造函数
InitializeBlockClass obj=new InitializeBlockClass();

    System.out.println(obj.field);

类的初始化顺序为:
首先是初始化块儿,然后是无参数的构造函数。
最终结果输出来是100.

第二次调用的有参数的构造函数。
当调用有参数的构造函数的时候,一样会先执行初始化块儿的里的东西,最后执行构造函数,这个构造函数把field设置为了300.

初始化的顺序

  1. static字段的内容
  2. 普通的初始化块儿
  3. 相应的构造函数

当继承了父类时,首先调用父类的,然后用自己的。(父类的和自己的都按照这个顺序来)

类创建的对象的计数器

    public class Staticforcount {
    static int count=0;
    Staticforcount() {
        count++;
    }
    public int getcount() {
        
        return count;
    }
    @SuppressWarnings("unused")
    public static void main(String[] args) {
        // TODO 自动生成的方法存根

        Staticforcount a=new Staticforcount();
        Staticforcount b=new Staticforcount();
//        System.out.println();
        System.out.println(count);
    }

}

代码很简单,不解释啦~

Responses