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

相关文章
|
19天前
|
前端开发 JavaScript Java
Java 开发中 Swing 界面嵌入浏览器实现方法详解
摘要:Java中嵌入浏览器可通过多种技术实现:1) JCEF框架利用Chromium内核,适合复杂网页;2) JEditorPane组件支持简单HTML显示,但功能有限;3) DJNativeSwing-SWT可内嵌浏览器,需特定内核支持;4) JavaFX WebView结合Swing可完美支持现代网页技术。每种方案各有特点,开发者需根据项目需求选择合适方法,如JCEF适合高性能要求,JEditorPane适合简单展示。(149字)
79 1
|
10天前
|
Java 索引
Java ArrayList中的常见删除操作及方法详解。
通过这些方法,Java `ArrayList` 提供了灵活而强大的操作来处理元素的移除,这些方法能够满足不同场景下的需求。
71 30
|
3天前
|
安全 Java API
Java 17 及以上版本核心特性在现代开发实践中的深度应用与高效实践方法 Java 开发实践
本项目以“学生成绩管理系统”为例,深入实践Java 17+核心特性与现代开发技术。采用Spring Boot 3.1、WebFlux、R2DBC等构建响应式应用,结合Record类、模式匹配、Stream优化等新特性提升代码质量。涵盖容器化部署(Docker)、自动化测试、性能优化及安全加固,全面展示Java最新技术在实际项目中的应用,助力开发者掌握现代化Java开发方法。
20 1
|
23天前
|
缓存 Java 数据库
Java 访问修饰符使用方法与组件封装方法详细说明
本文详细介绍了Java中访问修饰符(`public`、`private`、`protected`、默认)的使用方法,并结合代码示例讲解了组件封装的核心思想与实现技巧。内容涵盖数据封装、继承扩展、模块化设计与接口隔离等关键技术点,帮助开发者提升代码的可维护性与安全性,适用于Java初学者及进阶开发者学习参考。
31 1
|
Java
JAVA方法的定义
JAVA方法的定义
158 0
|
4月前
|
存储 JSON Java
《从头开始学java,一天一个知识点》之:方法定义与参数传递机制
**你是否也经历过这些崩溃瞬间?** - 看了三天教程,连`i++`和`++i`的区别都说不清 - 面试时被追问"`a==b`和`equals()`的区别",大脑突然空白 - 写出的代码总是莫名报NPE,却不知道问题出在哪个运算符 🚀 这个系列就是为你打造的Java「速效救心丸」!我们承诺:每天1分钟,地铁通勤、午休间隙即可完成学习;直击痛点,只讲高频考点和实际开发中的「坑位」;拒绝臃肿,没有冗长概念堆砌,每篇都有可运行的代码标本。上篇:《输入与输出:Scanner与System类》 | 下篇剧透:《方法重载与可变参数》。
106 25
|
安全 Java 编译器
杭州 【Java基础知识 11】java泛型方法的定义和使用(学习+改进+自己理解,想法) (借鉴-侵-删)
杭州 【Java基础知识 11】java泛型方法的定义和使用(学习+改进+自己理解,想法) (借鉴-侵-删)
94 1
|
存储 Java
Java数组与带参数方法:定义、调用及实践
Java数组与带参数方法:定义、调用及实践
148 1
|
存储 Java
Java中带返回值方法的定义与调用技术
Java中带返回值方法的定义与调用技术
196 1
|
Java
Java一分钟之-方法定义与调用基础
【5月更文挑战第8天】本文介绍了Java编程中的方法定义和调用,包括基本结构、常见问题和避免策略。方法定义涉及返回类型、参数列表和方法体,易错点有返回类型不匹配、参数错误和忘记返回值。在方法调用时,要注意参数传递、静态与非静态方法的区分,以及重载方法的调用。避免错误的策略包括明确返回类型、参数校验、理解值传递、区分静态和非静态方法以及合理利用重载。通过学习和实践,可以提升编写清晰、可维护代码的能力。
390 0