Java学习20181206


总结前一天学习,参考原文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的构造器。

 


作者:shiyuan310,发布于:2018/12/06
原文:https://www.cnblogs.com/beilou310/p/10076931.html