zoukankan      html  css  js  c++  java
  • Java中的static变量、方法、代码块初始化执行顺序

    Java中的static变量,方法,代码块

    1、static变量 
     按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。两者的区别是: 
     对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。 
     对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。

    2、static方法 
     静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联!这个需要去理解,想明白其中的道理,不是记忆!!! 
     因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。 

    3、static代码块 
     static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。

     1 class StaticSuper
     2 {
     3     static String country="SuperClass";
     4     
     5     {
     6         System.out.println("Class StaticSuper block is loading!");   //(5)
     7     } 
     8     
     9     static
    10     {
    11         //country = "china";
    12         System.out.println("Class StaticSuper static block is loading!");  //(3) 
    13     }
    14     StaticSuper()
    15     {
    16         System.out.println(country);    //(6)
    17     }
    18     
    19     void ShowMe()
    20     {
    21         System.out.println(country); 
    22     }
    23 
    24 }
    25 
    26 class StaticSub extends StaticSuper
    27 {
    28     static String country2="StaticSub String"; 
    29 
    30    {
    31      System.out.println("Class StaticSub block is loading!");//(7)
    32    } 
    33    static
    34    {
    35      System.out.println("Class StaticSub static block is loading!");   //(4)
    36    }   
    37    StaticSub()
    38    {
    39    System.out.println(country2);    //(8)
    40    }
    41   
    42    void ShowMe()
    43    {
    44    System.out.println(country2); 
    45    }  
    46 }
    47 
    48 class test
    49 {
    50     static
    51     {
    52         System.out.println("Class test is loading!");//(1)
    53     }
    54     public static void main(String [] args)
    55     {
    56         System.out.println("Begin executing main method!");//(2)
    57         //StaticCode st1=new StaticCode();
    58         StaticSuper st=new StaticSub();
    59         st.ShowMe();//(9)
    60     }
    61 }
    62 结果:
    63 
    64 Class test is loading!
    65 Begin executing main method!
    66 Class StaticSuper static block is loading!
    67 Class StaticSub static block is loading!
    68 Class StaticSuper block is loading!
    69 SuperClass
    70 Class StaticSub block is loading!
    71 StaticSub String
    72 StaticSub String

    说明:类的执行顺序是:

    父类静态代码 → 子类静态代码 → 父类非静态代码块 → 父类构造 → 子类非静态代码块 → 子类构造

    分别对应(3)(4)(5)(6)(7)(8)

    http://www.cnblogs.com/lxmanutd/archive/2011/07/20/2111799.html

    另一篇总结:http://i.cnblogs.com/EditPosts.aspx?postid=4086253 

    作者:SummerChill
    出处:http://www.cnblogs.com/DreamDrive/
    本博客为自己总结亦或在网上发现的技术博文的转载。 如果文中有什么错误,欢迎指出。以免更多的人被误导。
  • 相关阅读:
    阅读笔记09
    阅读笔记08
    阅读笔记07
    阅读笔记06
    阅读笔记05
    有关eclipse连接SQL Server 2008的问题
    每周进度条05
    软件需求模式阅读笔记04
    每周进度条04
    软件需求模式阅读笔记03
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/3917139.html
Copyright © 2011-2022 走看看