java继承初始化随笔
来源:互联网 发布:旺旺怎么联系淘宝客服 编辑:程序博客网 时间:2024/06/07 17:43
了解包括继承在内的初始化全过程,对所发生的一切有个全局性的把握,是很有益的。
//: Beetle.javaclass Insect { private int i = 9; protected int j; Insect() { System.out.println("i = " + i + ",j = " + j); j = 39; } private static int x1 = printInit("static Insect.x1 initialized"); static int printInit(String s) { System.out.println(s); return 47; }}public class Beetle extends Insect { private int k = printInit("Beetle.k initialized"); public Beetle() { System.out.println("k = " + k + "\nj = " + j); } private static int x2 = printInit("static Beetle.x2 initialized"); public static void main(String[] args) { System.out.println("Beetle constructor"); Beetle beetle = new Beetle(); }}
output:static Insect.x1 initializedstatic Beetle.x2 initializedBeetle constructori = 9,j = 0Beetle.k initializedk = 47j = 39 在Beetle上运行java时,所发生的第一件事是试图访问Beetle.main() (main是一个static方法),于是加载器开始启动并找出Beetle类的编译代码(在Beetle.class文件中)。在对它加载的过程中,编译器注意到它有一个基类,于是它继续进行加载。不管是否打算产生一个该基类的对象,这都要发生。 验证上一句话,将对象创建代码注释后 //Beetle beetle = new Beetle(); output: static Insect.x1 initialized static Beetle.x2 initialized Beetle constructor 如果该基类还有自身的基类,那么第二个基类就会加载,如此类推。接下来,根基类的static初始化就会被执行,然后是下一个派生类,以此类推。这种方式很重要,因为派生类的static初始化可能会依赖积累成员能否被正确初始化。 至此为止,必要的类都已经加载完毕,对象就可以创建了。首先,对象中所有的基本类型都会被设为默认值,对象引用被设为null。然后,基类的构造器就会被调用。在基类构造器完成之后,实例变量按次序被初始化。最后,构造器的其余部分被执行。上例中main方法位于Beetle中,接下来测试另一种情况:
//: Test.javaclass Insect { private int i = 9; protected int j; Insect() { System.out.println("i = " + i + ",j = " + j); j = 39; } private static int x1 = printInit("static Insect.x1 initialized"); static int printInit(String s) { System.out.println(s); return 47; }}class Beetle extends Insect { private int k = printInit("Beetle.k initialized"); public Beetle() { System.out.println("k = " + k + "\nj = " + j); } private static int x2 = printInit("static Beetle.x2 initialized");}public class Test { public static void main(String[] args) { System.out.println("Beetle constructor"); Beetle beetle = new Beetle(); } }
output:Beetle constructorstatic Insect.x1 initializedstatic Beetle.x2 initializedi = 9,j = 0Beetle.k initializedk = 47j = 39从此处可以发现,main方法中第一行的打印语句先执行了。接下来把对象创建语句注释掉 //Beetle beetle = new Beetle();output:Beetle constructor可以看到只有一条打印语句。此例可以帮助更清晰的了解类加载机制的第一步,对main方法的访问。
参考资料:thinking in java
阅读全文
0 0
- java继承初始化随笔
- java-继承(复习随笔)
- Java 继承与初始化
- java继承的初始化
- java继承 初始化顺序
- java继承初始化顺序
- Java继承与初始化
- Java继承与初始化
- JAVA的继承初始化
- JAVA--继承与初始化
- java随笔之类属性的初始化
- java继承中的初始化循序
- 例子演示java继承初始化
- java 继承 及 初始化顺序
- 【转载】java继承 初始化顺序
- Java类的初始化、继承
- Java继承和初始化顺序
- Java中的继承初始化顺序
- .两个对象值相(x.equals(y)==true),但却可有不同的hash code,这句话对不对?
- LightOJ
- 排序算法(四)快速排序算法
- Android上Java网络资源访问(二)使用HttpURLConnection多线程下载
- 网络是怎样连接的学习笔记(二)
- java继承初始化随笔
- HDU 1532 Drainage Ditches(最大流)
- book1 unit5 after-class reading 2 : Ready for Danger
- priority_queue用法详解
- javalesuo解析
- kuangbin KMP H题
- 工厂模式(二)-工厂方法模式(C++实现)
- arcpy之计算要素长度及面积
- 0913 Oracle 查询