JAVA的初始化顺序
这里主要是介绍JAVA的类的初始化顺序,比较基础;主要是以例子演示为主:
例子一:
1 package com.cnblog.GDUTtiantian;
2
3 /**
4 *
5 * @author GDUTtiantian
6 * @date 2014-5-19 下午1:30:10
7 * JAVA类的初始化顺序
8 */
9 public class Tiantian {
10
11 {
12 System.out.println("初始化:代码块1");
13 }
14
15 {
16 System.out.println("初始化:代码块2");
17 }
18
19 public Tiantian(){
20
21 System.out.println("Constructor:Tiantian");
22 }
23
24 {
25 System.out.println("初始化:代码块3");
26 }
27
28 public static void main(String[] args) {
29 Tiantian client = new Tiantian();
30 }
31
32 }
例子一运行结果: 初始化:代码块1 初始化:代码块2 初始化:代码块3 Constructor:Tiantian
非静态代码块和普通变量一样,按照在程序出现的先后顺序,被加载到构造器中进行初始化;所以它们被初始化的顺序就是在程序中的出现的先后顺序。
下一步,稍微修改下例子一的代码:
例子二:
1 package com.cnblog.GDUTtiantian;
2
3 /**
4 *
5 * @author GDUTtiantian
6 * @date 2014-5-19 下午1:30:10
7 * JAVA类的初始化顺序
8 */
9 public class Tiantian {
10
11 {
12 //这里编译不会出错,主要是当前代码块处于name属性的作用域范围。
13 this.name = "GDUT";
14 System.out.println("初始化:代码块1");
15 }
16
17 {
18 System.out.println("初始化:代码块2");
19 }
20
21 private String name = "tiantian";
22
23 public Tiantian(){
24
25 System.out.println("Constructor:Tiantian");
26 }
27
28 {
29 System.out.println("初始化:代码块3");
30 }
31
32 public static void main(String[] args) {
33 Tiantian client = new Tiantian();
34 System.out.println(client.name);
35 }
36
37 }
例子二运行结果: 初始化:代码块1 初始化:代码块3 初始化:代码块3 Constructor:Tiantian tiantian
理解了这里,可以帮助更好地理解JAVA类的初始化过程。JAVA类不是在定义private String name = "tiantian";的时候先对name进行初始化,而是在代码块一中就对name进行了初始化,name的值为”GDUT”,然后再进一步初始化,name的值为”tiantian”.下面一个例子主要是针对具有继承关系的两个类的初始化顺序的探讨。
例子三:
1 package com.cnblog.GDUTtiantian;
2
3
4 class Parent {//父类
5
6 {//Parent:block 1
7 this.name = "My parent.";
8 System.out.println("Parent:代码块1");
9 }
10
11 private String name = "A Parent.";
12
13 {//Parent:block 2
14 this.name = "Your parent.";
15 System.out.println("Parent:代码块2");
16 }
17
18
19 public Parent(){
20 System.out.println("Constructor:Parent");
21 System.out.println(this.name);
22 }
23
24 {//Parent:block 3
25 this.name = "Their parent.";
26 System.out.println("Parent:代码块3");
27 }
28 }
29
30 /**
31 *
32 * @author GDUTtiantian
33 * @date 2014-5-19 下午1:30:10
34 * JAVA类的初始化顺序
35 */
36 public class Tiantian extends Parent{
37
38 {//block 1
39 //这里编译不会出错,主要是当前代码块处于name属性的作用域范围。
40 this.name = "GDUT";
41 System.out.println("初始化:代码块1");
42 }
43
44 {//block 2
45 System.out.println("初始化:代码块2");
46 }
47
48 private String name = "tiantian";
49
50 public Tiantian(){
51
52 System.out.println("Constructor:Tiantian");
53 }
54
55 {//block 3
56 System.out.println("初始化:代码块3");
57 }
58
59 public static void main(String[] args) {
60 Tiantian client = new Tiantian();
61 System.out.println(client.name);
62 }
63
64 }
例子三运行结果: Parent:代码块1 Parent:代码块2 Parent:代码块3 Constructor:Parent Their parent. 初始化:代码块1 初始化:代码块2 初始化:代码块3 Constructor:Tiantian tiantian
首先,初始化子类时,会先去调用父类的构造器(如果没有显示调用,则编译器会自动调用父类的无参构造器,如果此时父类没有无参构造器,则编译会出错。),如果父类有继承其他类,则会调用其他类的构造器;否则,和例子二的初始化顺序一样。
总结:这里主要是涉及类的初始化,仅仅是非静态属性的初始化;还有其他的东西,后面会继续完善。
以上是个人的观点,欢迎交流讨论。
[从文章转到随笔]
JAVA的初始化顺序的更多相关文章
- Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序
静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行.执行顺序优先级:静态块,main(),构造块,构造方法. 构造函数 public H ...
- JAVA的初始化顺序:
JAVA的初始化顺序: 父类的静态成员初始化>父类的静态代码块>子类的静态成员初始化>子类的静态代码块>父类的代码块>父类的构造方法>子类的代码块>子类的构造 ...
- java 继承 初始化顺序
面向对象三大特性: 封装,继承,多态 java 继承初始化顺序 先初始化父类对象, 在父类对象中先初始化父类属性,再初始化父类的构造方法,然后初始化子类对象,初始化子类对象的属性,初始化子类的构造方法 ...
- 【知识总结】Java类初始化顺序说明
微信公众号:努力编程的小猪如有问题或建议,请公众号留言 Java类初始化顺序说明 一个类中包含如下几类东西,他们前后是有顺序关系的 静态属性:static 开头定义的属性 静态方法块: static ...
- java继承 初始化顺序
java继承 初始化顺序 标签: 初始化顺序 2013-08-01 10:13 879人阅读 评论(0) 收藏 举报 分类: java(8) 版权声明:本文为博主原创文章,未经博主允许不得转载. ...
- Java变量、Java对象初始化顺序
局部变量与成员变量: 局部变量分为: 行参:在方法签名中定义的局部变量,随方法的结束而凋亡. 方法内的局部变量:必须在方法内对其显示初始化,从初始化后开始生效,随方法的结束而凋亡. 代码块内的局部变量 ...
- Java对象初始化顺序
最近我发现了一个有趣的问题,这个问题的答案乍一看下骗过了我的眼睛.看一下这三个类: package com.ds.test; public class Upper { String upperSt ...
- Android(java)学习笔记136:Java类初始化顺序
Java类中初试化的顺序: 由此得出Java普通类初始化顺序结论: 静态变量 静态初始化块 变量 初始化块 构造器 由此得出Java继承类初始化顺序结论: 1 .继承体系的所有静态成员初始化( ...
- 【细说Java】Java变量初始化顺序
Java的变量初始化顺序,对这里一直似懂非懂,面试的时候也经常被问到,但答的一直不好,现在整理记录一下,以后忘记了可以来看看. 程序分为两个部分,第一个部分不考虑继承,第二个部分考虑继承: (1)不考 ...
随机推荐
- 如何在 Laravel 中连接多个 MySQL 数据库
第一步.定义数据库链接 config/database.php <?php return [ 'default' => 'mysql', 'connections' => [ # 主 ...
- @1-5使用pandas保存豆瓣短评数据
使用pandas保存豆瓣短评数据 Python爬虫(入门+进阶) DC学院 本节课程的内容是介绍open函数和pandas两种保存已爬取的数据的方法,并通过实际例子使用pandas保存数据. ...
- mysql.lib 的使用
一 说明 mysql.lib 提供了很多方便的操作,同时结合 vector 使用十分方便. 二 使用 1 声明需要用到的变量 static MYSQL s_mysql[DATABASE ...
- Spring Boot学习笔记:ApplicationEvent和ApplicationEventListener事件监听
采用事件监听的好处 以用户注册的业务逻辑为例,用户在填写完信息表单后,提交信息到后台,后台对用户信息进行处理,然后给用户返回处理结果的信息. 如上图所示,用户在注册时,后台需要处理一些系列流程,实际业 ...
- 【Tomcat】Tomcat + Memcached 实现session共享
概述 web项目中,Tomcat的访问量总是有限的,这时候就需要用到Tomcat集群,多个Tomcat的时候就要考虑Session共享的问题,这里介绍一种使用Memcached做Session共享的解 ...
- VB.NET中的DLL编写和调用的最简单示例
DLL(动态链接库)是一个很有用的东西,在开发大项目的时候显得非常重要,因为多人合作开发时,可以给每个人分配一个任务,用DLL完成,最后组合起来,就不会出现互相冲突的问题.这里给出最简单的DLL编写与 ...
- Python终端彩色字体的输出
实现过程: 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关. 转义序列是以ESC开头,即用\033来完成(ESC的ASCII码用十进制表示是27,用八进制表示就是033 ...
- Python之内置函数一
一:绝对值,abs i = abs(-123) print(i) # 打印结果 123 二:判断真假,all,与any 对于all # 每个元素都为真,才是True # 假,0,None," ...
- Python之字符串基本操作
#!/usr/bin/env python#-*-coding utf8-*-#Author:caojininfo = { 'stu1001': 'caojin', 'stu1002': 'zhaom ...
- 有关PHP 10条有用的建议--转(柒捌玖零)
1.使用ip2long() 和long2ip()函数来把IP地址转化成整型存储到数据库里. 这种方法把存储空间降到了接近四分之一(char(15)的15个字节对整形的4个字节),计算一个特定的地址是不 ...