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
复制代码

说明:类的执行顺序是:

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


本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/archive/2011/11/15/3917139.html,如需转载请自行联系原作者

相关文章
|
12月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
651 18
|
Java 编译器 Go
【Java】(5)方法的概念、方法的调用、方法重载、构造方法的创建
Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用方法的优点使程序变得更简短而清晰。有利于程序维护。可以提高程序开发的效率。提高了代码的重用性。方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson。这种就属于驼峰写法下划线可能出现在 JUnit 测试方法名称中用以分隔名称的逻辑组件。
460 4
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
606 5
|
算法 安全 Java
除了类,Java中的接口和方法也可以使用泛型吗?
除了类,Java中的接口和方法也可以使用泛型吗?
325 11
|
存储 Java 编译器
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(下)
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(下)
191 0
|
Java 编译器
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(上)
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(上)
220 1
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(上)
|
存储 Java 编译器
【Java SE】static成员及代码块
【Java SE】static成员及代码块
【Java SE】static成员及代码块
|
存储 Java
Java之static成员与代码块
本篇文章主要介绍JavaSE中一些不是很常见的知识点,但也会涉及,需要了解一下
278 0
Java之static成员与代码块
|
存储 设计模式 安全
Java SE基础知识详解第[7]期—面向对象进阶(static、单例、代码块、继承)
Java SE基础知识详解第[7]期—面向对象进阶(static、单例、代码块、继承)
1783 4
Java SE基础知识详解第[7]期—面向对象进阶(static、单例、代码块、继承)