Java构造器

一、无法阻止自动初始化的进行,它将在构造器被调用之前发生。

编译器不会强制你一定要在构造器的某一个地方或者在用他们之前对元素进行初始化——因为初始化早已得到了保证

public class Counter{
     int i;   
     Counter()   {i = 10;}
}

如上例子:编译器会先对i进行初始化为0,后若调用Couter构造器时对i进行赋值为10。

 

 

二、在类的内部,变量定义的先后顺序决定了初始化的顺序。即使变量定义散布于方法定义之间,他们仍旧会在任何方法(包括构造器)被调用之前得到初始化。

package com.Xan.Initial;


/*
在类的内部,变量定义的先后顺序决定了初始化的顺序。即使变量定义散布于方法定义之间,
他们仍旧会在任何方法(包括构造器)被调用之前得到初始化。
 */

class Window{
    public Window(int num) {
        System.out.println("Window(" + num + ")");
    }
}

class House{
    Window w1 = new Window(1);
    Window w2 = new Window(2);
    public House(){
        System.out.println("House()");
        w3 = new Window(33);
    }
    Window w3 =new Window(3);
    public void function(){
        System.out.println("f()");
    }
}

public class VariableInTurn {
    public static void main(String[] args) {
        House myhouse = new House();
        myhouse.function();
    }
}

/*
OUTPUT::
Window(1)
Window(2)
Window(3)
House()
Window(33)
f()
*/

 

三、静态变量的初始化

静态变量只有在必要时刻才会进行。初始化的顺序是: 先静态对象,而后是“非静态”对象。
构造器实际上也是静态方法。

class Bowl{
    Bowl(int marker){
        System.out.println("Bowl( "+ marker + " )");
    }
    void f1(int marker){
        System.out.println("f1( "+ ")");
    }
}
class Table{
    static Bowl bowl1 = new Bowl(1);
    Table(){
        System.out.println("Table()");
        bowl2.f1(1);
    }
    void f2(int marker){
        System.out.println("f2(" + marker + ")");
    }
    static Bowl bowl2 = new Bowl(2);
}
class Cupboard{
    Bowl bowl3 = new Bowl(3);
    static Bowl bowl4 = new Bowl(4);

    public Cupboard() {
        System.out.println("Cupboard()");
        bowl4.f1(2);
    }
    void f3 (int marker){
        System.out.println("f3("+marker + ")");
    }
    static Bowl bowl5 = new Bowl(5);
}

public class StaticInitial {
    public static void main(String[] args) {
        System.out.println("Creating new Cupboard() in main");
        new Cupboard();
        System.out.println("Creating new Cupboard() in main");
        new Cupboard();
        table.f2(1);
        cupboard.f3(1);
    }
    static Table table = new Table();
    static Cupboard cupboard = new Cupboard();
}
/*
OUTPUT::
Bowl( 1 )
Bowl( 2 )
Table()
f1( )
Bowl( 4 )
Bowl( 5 )
Bowl( 3 )
Cupboard()
f1( )
Creating new Cupboard() in main
Bowl( 3 )
Cupboard()
f1( )
Creating new Cupboard() in main
Bowl( 3 )
Cupboard()  
f1( )
f2(1)
f3(1)
 */

创建对象的过程
1、创建一个新的对象的时候,Java解释器会找到该对象的Class文件。
2、载入对象的Class文件(创建一个Class对象)有关静态初始化的所有动作都会执行。
3、当new一个对象的时候。首先将堆上该对象分配足够的空间。
4、该空间会被清零,这就自动的为该对象的所有属性设成默认值。
5、执行所有出现于字段定义处的初始化动作
6、执行构造器。

 

 

若对一个对象进行System.out.println(对象名)   该操作,默认行为(如果没有定义toString方法的话)就是打印类的名字和对象的地址。

 

posted @ 2020-04-10 20:45  RichXan  阅读(228)  评论(0编辑  收藏  举报