Java object Initialization (class Instantiation) | 对象的初始化(即类的实例化)
类实例即对象。对象的初始化过程也就是类的实例化过程。
inside JVM作者Bill Venners关于对象初始化的文章很棒:
Object Initialization in Java:
http://www.artima.com/designtechniques/initializationP.html
一些名词概念:
Class Instance Creation Expressions:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.9
用来创建类实例对象。
格式简单表述: new nameOfClass(argument list)
Explicit Constructor Invocations:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.7.1Instance Initializers
http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.6
即实例初始化块(Instance Initialization Blocks)、非静态初始化块(Non-static Initialization Blocks)。
实例初始化块中不能有return语句。 Srcs:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8
http://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html
this & super:
this
表示当前对象的引用,只能用在实例初始化块(Instance Initializer)、非静态方法(instance method)和构造方法中。有两个用途:
一 this.的方式,访问当前对象的成员members(static fields/non-static fiels/class method/instance method)。一个常见的使用场景是:当实例方法(或构造方法)参数与实例变量同名,造成实例变量被遮蔽时,实例方法对实例变量的访问必须通过 this. :
public class ObjectInitializeTest {public static void main(String[] args) throws Exception {Parent p = new Parent();System.out.println();Child c = new Child();System.out.println();//InitialBlockTest cc = new InitialBlockTest(); //StackOverflowError}}class Parent { {System.out.println("Parent Instance Initializers 1");} static { System.out.println("Parent Static Initializers 1"); } {System.out.println("Parent Instance Initializers 2");} static { System.out.println("Parent Static Initializers 2"); } public Parent(){ System.out.println("Parent 0-argument constructor"); }} class Child extends Parent {int i;{System.out.println("Child Instance Initializers 1");} static { System.out.println("Child Static Initializers 1"); } {System.out.println("Child Instance Initializers 2");} static { System.out.println("Child Static Initializers 2"); } Child() {this(1);System.out.println("Child 0-argument Constructor");}Child(int i) {this(10, i);System.out.println("Child 1-argument Constructor");}Child(int i, int j) {this.i = 1;System.out.println("Child 2-argument Constructor");}Child(String s) {i = 2;}}//StackOverflowErrorclass InitialBlockTest {{System.out.println("InitialBlockTest - Non-static Instance Initializers ");new InitialBlockTest();}static {System.out.println("InitialBlockTest - Static Initializers ");}InitialBlockTest() {System.out.println("InitialBlockTest - Constructor");}}输出:引用Parent Static Initializers 1