总结前一天学习,参考原文http://www.cnblogs.com/dolphin0520/p/3799052.html
1: 对Static有了进一步的认识
这个地方重点是初始化各个变量顺序,以及构造函数。
对一个类,加载class,首先加载Static变量或代码块 (若有父类,会先加载父类中的static变量),创建实例时先创建实例变量,然后是构造函数(若有父类,先初始化父类中的实例变量)。
因为static变量是类变量,和对象无关。而非Static函数是在对象初始化后才可以用,所以非static函数不能调用static变量。
1 package lesson.review; 2 3 public class Test1 { 4 5 static{ 6 System.out.println(\"test1 static\"); 7 } 8 Person person=new Person(\"test1\"); 9 Test1(){ 10 System.out.println(\"Test1 construct\"); 11 12 } 13 14 public static void main(String[] args) { 15 new Myclass(); 16 } 17 } 18 19 class Person{ 20 static { 21 System.out.println(\"Person static\"); 22 } 23 24 public Person(String str) { 25 System.out.println(\"Person construct is from \"+str); 26 27 } 28 29 } 30 31 class Myclass extends Test1{ 32 Person person = new Person(\"Myclass\"); 33 34 static{ 35 System.out.println(\"Myclass static\"); 36 } 37 38 Myclass(){ 39 System.out.println(\"Myclass construct\"); 40 } 41 }
运行结果:
test1 static
Myclass static
Person static
Person construct is from test1
Test1 construct
Person construct is from Myclass
Myclass construct
下面分析下代码执行过程:首先加载Test1类, 因此会执行Test1类中的static快。 接着开始实行Test的main()函数,执行new Myclass(). 而Myclass还没有被加载,因此需要加载Myclass类。在加载Myclass类时,发面Myclass继承自Tets1类。不过Test1类已经加载了。所以只需加载自己Myclass类。那么就会执行Myclass 的static快。 在加载完后,就通过构造器来生成对象。而在生成对象的时候,必须先初始化父类的成员变量。因此会执行Test1中的 Person person=new Person(\"test1\"); 而Person类还没有被加载过,因此会先加载Person类中的static,接着执行Person类的构造函数。然后执行父类Test类的构造函数。完成父类的初始化。接着退回完成Myclass自身的初始化,因此会接着执行Person person = new Person(\"Myclass\");最后执行Myclass的构造器。
继续阅读与本文标签相同的文章
-
Java锁---偏向锁、轻量级锁、自旋锁、重量级锁
2026-05-19栏目: 教程
-
CTF从入门到提升(七)insert 等数据表相关操作注入及例题分享
2026-05-19栏目: 教程
-
合肥新闻联播:“NEXT创新大会”合肥重磅开年 聚焦“新经济”赋能产业升级
2026-05-19栏目: 教程
-
NEXT创新大会走进合肥,看“新经济”带“科创之都”腾飞。
2026-05-19栏目: 教程
-
win7系统想要用iis7远程桌面管理,可是他显示说你没有开通远程权限怎么解决?
2026-05-19栏目: 教程
