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,如需转载请自行联系原作者

相关文章
|
30天前
|
Java 编译器
java“变量 x 可能未被初始化”解决
在Java中,如果编译器检测到变量可能在使用前未被初始化,会报“变量 x 可能未被初始化”的错误。解决方法包括:1. 在声明变量时直接初始化;2. 确保所有可能的执行路径都能对变量进行初始化。
|
8天前
|
Java 编译器
Java重复定义变量详解
这段对话讨论了Java中变量作用域和重复定义的问题。学生提问为何不能重复定义变量导致编译错误,老师通过多个示例解释了编译器如何区分不同作用域内的变量,包括局部变量、成员变量和静态变量,并说明了使用`this`关键字和类名来区分变量的方法。最终,学生理解了编译器在逻辑层面检查变量定义的问题。
Java重复定义变量详解
|
1天前
|
Java 程序员 容器
Java中的变量和常量:数据的‘小盒子’和‘铁盒子’有啥不一样?
在Java中,变量是一个可以随时改变的数据容器,类似于一个可以反复打开的小盒子。定义变量时需指定数据类型和名称。例如:`int age = 25;` 表示定义一个整数类型的变量 `age`,初始值为25。 常量则是不可改变的数据容器,类似于一个锁死的铁盒子,定义时使用 `final` 关键字。例如:`final int MAX_SPEED = 120;` 表示定义一个名为 `MAX_SPEED` 的常量,值为120,且不能修改。 变量和常量的主要区别在于变量的数据可以随时修改,而常量的数据一旦确定就不能改变。常量主要用于防止意外修改、提高代码可读性和便于维护。
|
8天前
|
Java 程序员 数据库连接
Java执行顺序大揭秘:静态块、非静态块和构造方法谁先谁后?
本文详细介绍了Java中的初始化块,包括静态初始化块和非静态初始化块的概念、执行顺序和实际应用场景。通过具体示例,帮助读者理解这两种初始化块的区别和使用场景,让面试官对你刮目相看。
18 0
Java执行顺序大揭秘:静态块、非静态块和构造方法谁先谁后?
|
13天前
|
Java
Java 静态变量的初始化顺序
【10月更文挑战第15天】了解 Java 静态变量的初始化顺序对于正确编写和维护代码至关重要。通过深入理解初始化顺序的原理和细节,我们可以更好地避免潜在的问题,并提高代码的质量和可靠性。
|
13天前
|
存储 Java
Java 中的静态(static)
【10月更文挑战第15天】静态是 Java 语言中一个非常重要的特性,它为我们提供了一种方便、高效的方式来管理和共享资源。然而,在使用过程中,我们需要谨慎考虑其优缺点,以确保代码的质量和可维护性。
|
17天前
|
Java
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。
|
25天前
|
Java 程序员
Java 面试高频考点:static 和 final 深度剖析
本文介绍了 Java 中的 `static` 和 `final` 关键字。`static` 修饰的属性和方法属于类而非对象,所有实例共享;`final` 用于变量、方法和类,确保其不可修改或继承。两者结合可用于定义常量。文章通过具体示例详细解析了它们的用法和应用场景。
25 3
|
存储 Java 数据库
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(中)
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(中)
63 1
|
Java 编译器
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(上)
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(上)
63 1
Java-对象的操作(构造、初始化、封装)、static成员以及代码块(上)
下一篇
无影云桌面