《java技术专题综述之构造方法篇》由会员分享,可在线阅读,更多相关《java技术专题综述之构造方法篇(5页珍藏版)》请在金锄头文库上搜索。
1、 JAVA 技术专题综述之构造方法篇类的继承机制使得子类可以使用父类的功能(即代码) ,并且子类也具有父类的类型。 下面介绍 类在继承关系上的初始化的顺序问题。 示例 1: class SuperClass SuperClass()System.out.println(“SuperClass constructor“); public class SubClass extends SuperClass SubClass()System.out.println(“SubClass constructor“);public static void main(String args)SubClass
2、 sub = new SubClass(“sub“); 在 JDK 下编译此程序不能成功。正如上例中说的:程序在初始化子类时先要寻找其父 类的默认构造方法,结果没找到,那么编译自然不能通过。 解决这个问题有两个办法: 1 在父类中增加一个默认构造方法。 2 在子类的构造方法中增加一条语句:super(str); 且必须在第一句。这两种方法都能使此程序通过编译,但就本程序来说运行结果却不相同。第 1 种方法的运行结果是:Sub with a string.第 2 种方法的运行结果是:Super with a string.Sub with a string.第 2 种解决方法实际上是指定编译器不
3、要寻找父类的默认构造方法,而是去寻找带一 个字符串为参数的构造方法。下面介绍对象的初始化顺序问题。 示例 3: class One One(String str)System.out.println(str); class Two One one_1 = new One(“one-1“);One one_2 = new One(“one-2“);One one_3 = new One(“one-3“);Two(String str)System.out.println(str); public class Test public static void main(String args)Sys
4、tem.out.println(“Test main() start.“);Two two = new Two(“two“); 输出结果: Test main() start. one-1 one-2 one-3 two在 main()方法中实例化了一个 Two 类的对象。但程序在初始化 Two 类的对象时,并非 先调用 Two 类的构造方法,而是先初始化 Two 类的成员变量。这里 Two 类有 3 个成员变 量,它们都是 One 类的对象,所以要先调用 3 次 One 类的相应的构造方法。最后在初始化 Two 类的对象。 示例 4: class One One(String str)Sys
5、tem.out.println(str); class Two One one_1 = new One(“one-1“);One one_2 = new One(“one-2“);static One one_3 = new One(“one-3“);Two(String str)System.out.println(str); public class Test public static void main(String args)System.out.println(“Test main() start.“);Two two_1 = new Two(“two-1“);System.out
6、.println(“-“);Two two_2 = new Two(“two-2“); 输出结果: Test main() start. one-3 one-1 one-2 two-1 - one-1 one-2 two-2如果一个类中有静态对象,那么它会在非静态对象前初始化,但只初始化一次。非静态 对象每次调用时都要初始化。 示例 5: class One One(String str)System.out.println(str); class Two One one_1 = new One(“one-1“); One one_2 = new One(“one-2“); static On
7、e one_3 = new One(“one-3“); Two(String str) System.out.println(str); public class Test static Two two_3 = new Two(“two-3“);public static void main(String args)System.out.println(“Test main() start.“);Two two_1 = new Two(“two-1“);System.out.println(“-“);Two two_2 = new Two(“two-2“); 输出结果: one-3 one-1
8、 one-2 two-3 Test main() start. one-1 one-2 two-1 - one-1 one-2 two-2程序中主类的静态变量会在 main()方法执行前初始化。结果中只输出了一次 one-3,这 也说明:如果一个类中有静态对象,那么它会在非静态对象前初始化,但只初始化一次。 非静态对象每次调用时都要初始化。 示例 6: class One One(String str)System.out.println(str); class Two static int i = 0;One one_1 = new One(“one-1“);static One one_2
9、 = new One(“one-2“);static One one_3 = new One(“one-3“);Two(String str)System.out.println(str); public class Test public static void main(String args)System.out.println(“Test main() start.“);System.out.println(“Two.i = “ + Two.i); 输出结果: Test main() start. one-2 one-3 Two.i = 0不仅第 1 次创建对象时,类中所有的静态变量要
10、初始化,第 1 次访问类中的静态变量 (没有创建对象)时,该类中所有的静态变量也要按照它们在类中排列的顺序初始化。 综上所述:在创建对象时,对象所在类的所有数据成员会首先进行初始化,如果其中的成员变量 有对象,那么它们也会按照顺序执行初始化工作。在所有类成员初始化完成后,才调用对 象所在类的构造方法创建对象。构造方法作用就是初始化。静态对象(变量)在非静态对象前初始化。静态对象(变量)只初始化一次,再次调 用就不初始化了,但非静态对象在每次调用时都要初始化。程序中的主类的静态变量会在 main()方法执行前进行初始化工作。不仅第 1 次创建对象时,类中所有的静态变量要初始化,第 1 次访问类中的静态变量 (没有创建对象)时,该类中所有的静态变量也要按照它们在类中排列的顺序初始化。 初始化的顺序包括构造方法调用的顺序如下: 1 主类的静态成员首先初始化。 2 主类的超类的构造方法按照从最高到最低的顺序被调用。 3 主类的非静态对象(变量)初始化。 4 调用主类的构造方法。在一个构造方法中只能调用一次其它的构造方法,并且调用构造方法的语句必须是第 一条语句。