Java 数据类型、对象引用 和 构造器 之间的初始化顺序

发布时间:2018-08-04作者:laosun阅读(557)

Java

    我们可以使用构造器来初始化数据,如下所示:

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

    看上边的例子:我们可以得出:i首先会被设置成0,然后变成7,对于所有基本类型和对象引用,包括在定义时已经指定了初始值的变量。编译器不会强制你一定要在构造器的某个地方或者在使用它们之前对元素进行初始化,因为初始化这个过程已经得到了一定的保证。

    在运行时刻,可以调用方法或者执行某些动作来确定初始值,这为编程带来了很大的灵活性;但是要牢记:无法阻止自动初始化的进行,因为他们将在构造器被调用之前就完成了初始化。

    下边我们来看个例子:

    class Window {
    	public Window(int marker) {
    		System.out.println("window(" + marker + ")");
    	}
    }
    
    class House {
    	Window w1 = new Window(1);
    
    	House() {
    		System.out.println("House()");
    		// w1 这个引用被初始化了两次,一次是在调用构造器之前,一次是在调用期间(第一次初始化的对象将被丢弃,并作为垃圾回收)
    		w1 = new Window(11);
    	}
    
    	Window w2 = new Window(2);
    
    	void f() {
    		System.out.println("f()");
    	}
    
    	Window w3 = new Window(3);
    }
    
    /**
     * 基本类型以及对象引用初始化,可以使用构造器来进行初始化 
     * 但要牢记:无法阻止初始化的进行,因为他们将在构造器被调用之前完成初始化
     * 这个例子将window对象的定义散步到各处,来证明他们全部都会在调用构造器或者其他方法之前就完成了初始化
     * 
     * @author sun
     */
    public class OrderOfInitialization {
    
    	public static void main(String[] args) {
    		House house = new House();
    		house.f();
    	}
    
    }

    执行结果如下:

    window(1)
    window(2)
    window(3)
    House()
    window(11)
    f()


    知识拓展:

    基本数据类型都是有一个默认值的。

    基本类型 默认值
    boolean false
    char '\u0000' (null)
    byte (byte)0
    short (short)0
    int 0
    long 0L
    float 0.0f
    double 0.0d


    如何测试他们的默认值呢,我们都知道在定义变量时,不指定会编译异常,初始化失败

    请看下边:

    public class InitTest {
    
    	private boolean flag;
    	private char c;
    	private byte b;
    	private short s;
    	private int i;
    	private long l;
    	private float f;
    	private double d;
    
    	public static void main(String[] args) {
    		InitTest it = new InitTest();
    		System.out.println(it.flag);
    		System.out.println(it.c);
    		System.out.println(it.b);
    		System.out.println(it.s);
    		System.out.println(it.i);
    		System.out.println(it.l);
    		System.out.println(it.f);
    		System.out.println(it.d);
    	}
    
    }

    输出结果:

    false
    
    0
    0
    0
    0
    0.0
    0.0

    若某个类的成员是基本数据类型,即使没有进行初始化,java也会确保他们获得一个初始值、默认值。如上所示

    当变量为类的成员使用时,java才确保给定其默认值,以确保那些事基本数据类型的成员变量得到初始化,防止产生程序错误,但是,这些初始值对你的程序来说,可能是不正确的,甚至是不合法的,所以最好明确的对变量进行初始化。

    切记:上边的默认值并不适用于“局部”变量(就是并非是某个类的字段)

0 +1

版权声明

 Java  源码

 请文明留言

0 条评论