【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类的各种成员初始化顺序
父子类继承时的静态代码块,普通代码块,静态方法,构造方法,等先后顺序 前言: 普通代码块:在方法或语句中出现的{}就称为普通代码块.普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出 ...
随机推荐
- 使用Linux碎解三_CentOS7搭建Lamp环境安装zabbix遇到的问题
问题一: 执行不了 yum命令 解决方案:配置系统的DNS(详细参见碎解二) 问题二: make 命令的时候,出现错误 提示 和没有gcc大体相关 解决方案:yum install gcc (在网 ...
- centos7安装openoffice
[摘要:间接登录openoffice民网下载硬件包,但跳转的页里却不停挨没有开.末了只能正在末端里干活下了: 1. 挑选得当的版本:http://www.openoffice.org/download ...
- [转]hp电脑重装win7 64位 后 所有软件都装不上问题
hp 电脑重装后 所有软件都装不上问题 装了近100来次机,第一次遇到这样的. bug描述: 新笔记本刚装了纯净版的64位旗舰版win7,想装软件,就弹出已停止工作.比如装火狐浏览器,弹出火狐浏览器网 ...
- LDAP与migrationtools 导入系统账号
1:安装migrationtools yum -y install migrationtools 2:修改配置文件 cd /usr/share/migrationtools 可以看到很多的文件 ...
- python 循环嵌套
需求如下: 1. #定义商品列表类 # def shangpin_list(): # for i in com_list: # print(com_list.index(i),end=" & ...
- 启用与关闭 Ad Hoc Distributed Queries
在数据库里执行以下脚本: 启用: exec sp_configure 'show advanced options',1reconfigureexec sp_configure 'Ad Hoc Dis ...
- setValue和setObject的区别
在NSMutableDictionary的方法中有setValue forKey与setObject forKey,它们都可以用来设置某一个key值对应的value 1,setValue: forKe ...
- Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80070005.
Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} fai ...
- android BluetoothLE 多个 setCharacteristicNotification writeCharacteristic 失效
如果在搜索完服务后,执行多个 setCharacteristicNotification 或 writeCharacteristic 操作,某些操作可能会无效.需要在中间等待一些时间,真是一个大坑! ...
- transition-delay
https://developer.mozilla.org/en-US/docs/Web/CSS/transition-delay