总结前一天学习,参考原文
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的构造器。
如对本文有疑问, 点击进行留言回复!!
网友评论