zoukankan      html  css  js  c++  java
  • Java static 语句块

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

    分析:对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。

    一定是子类static执行完后才去执行父类的构造函数。  因为是调用之类的构造函数时才回去调用父类的构造函数
    而且子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。

  • 相关阅读:
    架构师之路--视频业务介绍,离线服务架构和各种集群原理
    架构师之路--怎样聊技术天,限流技术和各类编程语言
    一条项目中常用的linux命令引发的经典算法题
    架构师之路--应用架构的选型和dubbo
    乐视开放平台技术架构-servlet和spring mvc篇
    架构师之路--从业务角度谈缓存的选型
    架构师之路--谈业务的合理架构
    IO回忆录之怎样过目不忘(BIO/NIO/AIO/Netty)
    520特篇-爱的境界
    编程十年的十种武学境界
  • 原文地址:https://www.cnblogs.com/beilou310/p/10076931.html
Copyright © 2011-2022 走看看