【Thinking in Java】类和对象的初始化过程
在Java中,
当一个类被调用的时候,它的初始化过程是怎么样的呢?
当一个类被实例化的时候,它的初始化过程又是怎样的呢?
为什么static方法不能未经对象就调用非static方法?
下面我们通过例子来找出答案。
当该类没有父类时
测试代码:
public class ClassLoadingTest {
static String staticString=getStaticString(); //静态成员变量
private String privateString=getPrivateString();//普通成员变量
public ClassLoadingTest() {
System.out.println("Loading ClassLoadingTest()");
}
public static void loadStaticMethod() {
System.out.println("Loading static method");
}
private void loadNotStaticMethed(){
System.out.println("Loading NotStaticMethed");
}
private String getPrivateString() {
String string=new String("Loading private variable");
System.out.println(string);
return string;
}
private static String getStaticString() {
String string=new String("Loading static variable");
System.out.println(string);
return string;
}
public static void main(String[] args) {
loadStaticMethod(); //加载静态方法
System.out.println("try to new ClassLoadingTest()");
ClassLoadingTest test=new ClassLoadingTest();
test.loadNotStaticMethed();//加载普通方法
}
}
打印结果:
Loading static variable Loading static method try to new ClassLoadingTest() Loading private variable Loading ClassLoadingTest() Loading NotStaticMethed
分析结果:
- 当调用该类的某个静态方法时,首先加载该类的静态成员变量和静态方法(此时类还没有实例化)
- 当new该类之后,会加载该类的普通成员变量,然后才是构造方法。
得出结论:
当一个类没有父类的时候,加载顺序为:
静态成员变量/静态方法-->开始实例化-->普通成员变量/普通方法-->构造方法-->实例化结束。
当该类有父类的时:
测试代码:
父类:
public class ClassLoadingTestSuper {
static String staticString=getSuperStaticString(); //父类的静态成员变量
private String privateString=getSuperPrivateString(); //父类的普通成员变量
public ClassLoadingTestSuper() {
System.out.println("Loading ClassLoadingTestSuper()");
}
private String getSuperPrivateString() {
String string=new String("Loading super class private variable");
System.out.println(string);
return string;
}
private static String getSuperStaticString() {
String string=new String("Loading super class static variable");
System.out.println(string);
return string;
}
}
子类:
public class ClassLoadingTest extends ClassLoadingTestSuper {
/*内容与ClassLoadingTest相同*/
}
打印结果:
Loading super class static variable Loading static variable Loading static method try to new ClassLoadingTest() Loading super class private variable Loading ClassLoadingTestSuper() Loading private variable Loading ClassLoadingTest() Loading NotStaticMethed
分析结果:
- 首先加载的是父类的static变量和方法;
- 然后加载的是该类的static变量和方法;
- 将该类实例化;
- 然后加载的是父类的普通成员变量和方法;
- 然后加载的是父类的构造方法;
- 然后加载的是该类的成员变量和方法;
- 然后加载的才是该类的构造方法;
- 最后实例化结束,外部才可以操作该对象。
得出结论:
当该类有父类的时候,类的实例化的加载过程是:
父类的static成员变量和方法-->该类的static变量和方法-->开始实例化-->父类的普通成员变量和方法-->父类的构造方法-->该类的普通成员变量和方法-->该类的构造方法-->实例化结束。
【Thinking in Java】类和对象的初始化过程的更多相关文章
- 解析Java类和对象的初始化过程
类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要的两个环节,Google 了一遍网络,有关类装载机制的文章倒是不少,然而类初始化和对象初始化的文章并不多,特别是从字节码和 JVM 层次来 ...
- [转载]解析 Java 类和对象的初始化过程
原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-clobj-init/index.html 由一个单态模式引出的问题谈起 类的初始化和对象初始化 ...
- Java基础——类和对象的初始化过程
本节把类和对象的初始化所涉及到的所有代码块阐述一边. 示例代码: public class Demo { private static String name; private String age; ...
- AJPFX总结Java 类与对象的初始化
面试的时候,经常会遇到这样的笔试题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和静态块,它们只包含一些简单的输出字符串到控制台的代码,然后让我们写出正确的输出结果.这实际上是在考察 ...
- Java类的实例化的初始化过程
A a = new A(); new 创建对象过程: 1.类加载 代码验证 2.给对象在内存(堆)中分配空间(给属性赋值): 3.属性赋默认值: byte,short.int,long -&g ...
- Java类和对象初始化
类的生命周期: Java类的初始化: 本阶段负责为类变量赋正确的初始值.(类变量即静态变量) Java编译器把所有的类变量初始化语句和静态初始化器通通收集到<clinit>方法中,该方法只 ...
- JAVA基础之对象的初始化
本文主要记录JAVA中对象的初始化过程,包括实例变量的初始化和类变量的初始化以及 final 关键字对初始化的影响.另外,还讨论了由于继承原因,探讨了引用变量的编译时类型和运行时类型 一,实例变量的初 ...
- [Java初探08]__简单学习Java类和对象
前言 在前面的学习中,我们对面向对象的编程思想有了一个基本的了解,并且简单的了解了类和对象的定义.那么类和对象在Java语言中是如何表现的,这次,就从实际出发,学习一下一下类和对象在Java语言中的使 ...
- 【基础】java类的各种成员初始化顺序
父子类继承时的静态代码块,普通代码块,静态方法,构造方法,等先后顺序 前言: 普通代码块:在方法或语句中出现的{}就称为普通代码块.普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出 ...
随机推荐
- 在CentOS上搭建Storm集群
Here's a summary of the steps for setting up a Storm cluster: Set up a Zookeeper clusterInstall depe ...
- Angularjs学习笔记(一)
大部分传统的模板系统,对模板的渲染是个线性单向的过程:模板或变量与模板混合在一起产生结果的标记集合.任何对模型的改变都需要通过模板的重新计算.但AngularJS有所不同,任何用户引发的视图的改变,都 ...
- CC1310的RSSI值问题
前几日,做CC1310的通信距离测试,发现我的CC1310的板子在433MHz,50kbps下通信距离非常近,RSSI值下探至-80左右就无法正常通信,与TI宣称的-120dbm接收灵敏度差距较大.使 ...
- OpenLDAP双主
1:主A服务器 然后重新生成配置文件数据 主B服务器 注意:两个主服务器的rid必须得一样 在做主从的时候,必须得安装必要的软件包,comp ...
- db2 with ur
这几天查询DB2数据库,老遇到select * from XXX with ur, 好奇ur是什么作用,现在记录一下. DB2中,共有四种隔离级:RS,RR,CS,UR,DB2提供了这4种不同的保护级 ...
- Proxy(代理)-对象结构型模式
1.意图 为其它对象提供一种代理以控制对这个对象的访问. 2.别名 Surrogate. 3.动机 通过Proxy可以达到对一个对象的访问控制. 4.适用性 远程代理 为一个对象在不同地址空间提供局 ...
- NSMutableAttributedString的使用
1.设置字符串中数字字符串的颜色: // 设置字符串中数字的颜色 - (void)setTextColor:(UILabel *)label FontNumber:(id)font AndRange: ...
- Android的post()方法究竟运行在哪个线程中
Android中我们常用的post()方法大致有两种情况: 1.如果post方法是handler的,则Runnable执行在handler依附线程中,可能是主线程,也可能是其他线程 2.如果post方 ...
- centos文件误删除恢复
Centos 文件误删除 当意识到误删除文件后,切忌千万不要再频繁写入了,否则 你的数据恢复的数量将会很少. 而我们要做的是,第一时间把服务器上的服务全部停掉,直接killall 进程名 或者 kil ...
- Java(数组)动手动脑
1>数组作为方法参数 阅读并运行示例PassArray.java,观察并分析程序输出的结果,小结,然后与下页幻灯片所讲的内容进行对照. 源代码: // PassArray.java // Pas ...