【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 rar安装
wget http://www.rarsoft.com/rar/rarlinux-x64-5.1.1.tar.gz tar -zxvf rarlinux-x64-5.1.1.tar.gz # cd r ...
- WPF功能点
if ("TextBoxBase".Contains(Keyboard.FocusedElement.GetType().BaseType.Name)) { return; } 1 ...
- js/jstl/el的区别
JavaScript 学习的路径:http://www.w3school.com.cn/js/js_intro.asp 是世界上最流行的编程语言. 这门语言可用于 HTML 和 web,更可广泛用于服 ...
- c++总结01
今天编写了四个小程序分别是“石头剪刀布游戏”“数字之间加空格输出”“蛇形矩阵”“螺旋矩阵”. 通过编写石头剪刀布代码 熟悉了switch语句和if语句的使用,同时也运用了do..while语句,其中 ...
- Mac上的欧路词典单词本迁移到有道词典 #node.js
摘要 有道词典提供了柯林斯和朗文辞典,加上最近在背单词且Mac版的屏幕取词也够用了,为了云单词本的同步,决定抛弃Mac上的欧路词典.单词欧路上的单词本也存了一百多个单词.怎样迁移到有道呢? 关键词:n ...
- TreeMap的使用
Map<Integer, String> map = new TreeMap<Integer, String>();//TreeMap本身具有排序功能(默认按键升序排序) ma ...
- ThinkPHP 3.2.3 文件上传时间目录问题
上传文件的代码如下 在上传文件的时候会默认生成时间目录, 但是有些时候,并不想生成时间目录,而是储存在我们自己定义的目录下,可以这样做: 只需要添加 $upload->autoSub = fal ...
- Java GC工作原理以及Minor GC、Major GC、Full GC简单总结
名词解释: GC:垃圾收集器 Minor GC:新生代GC,指发生在新生代的垃圾收集动作,所有的Minor GC都会触发全世界的暂停(stop-the-world),停止应用程序的线程,不过这个过程非 ...
- Http协议的常见参数
Requests部分 Header 解释 示例 Accept 指定客户端能够接收的内容类型 Accept: text/plain, text/html Accept-Charset 浏览器可以接受的字 ...
- 如何在一个div标签里显示出另一个网页? <iframe src=" http://www.baidu.com " width="800px" height="200px" scrolling="no" frameborder="0"> </iframe>
如何在一个div标签里显示出另一个网页? 用在div里用iframe,就像下面的代码 <iframe src=" http://www.baidu.com " width=& ...