Java 中类的加载顺序
如果类A和类B中有静态变量,静态语句块,非静态变量,非静态语句块,构造函数,静态方法,非静态方法,同时类A继承类B,请问当实例化A时,类内部的加载顺序是什么?
测试代码如下:
Class B:
public class B{
//静态变量
static int i=1;
//静态语句块
static {
System.out.println("Class B1:static blocks"+i);
}
//非静态变量
int j=1;
//静态语句块
static{
i++;
System.out.println("Class B2:static blocks"+i);
}
//构造函数
public B(){
i++;
j++;
System.out.println("constructor B: "+"i="+i+",j="+j);
}
//非静态语句块
{
i++;
j++;
System.out.println("Class B:common blocks"+"i="+i+",j="+j);
}
//非静态方法
public void bDisplay(){
i++;
System.out.println("Class B:static void bDisplay(): "+"i="+i+",j="+j);
return ;
}
//静态方法
public static void bTest(){
i++;
System.out.println("Class B:static void bTest(): "+"i="+i);
return ;
}
}
Class A:
public class A extends B{
//静态变量
static int i=1;
//静态语句块
static {
System.out.println("Class A1:static blocks"+i);
}
//非静态变量
int j=1;
//静态语句块
static{
i++;
System.out.println("Class A2:static blocks"+i);
}
//构造函数
public A(){
super();
i++;
j++;
System.out.println("constructor A: "+"i="+i+",j="+j);
}
//非静态语句块
{
i++;
j++;
System.out.println("Class A:common blocks"+"i="+i+",j="+j);
}
//非静态方法
public void aDisplay(){
i++;
System.out.println("Class A:static void aDisplay(): "+"i="+i+",j="+j);
return ;
}
//静态方法
public static void aTest(){
i++;
System.out.println("Class A:static void aTest(): "+"i="+i);
return ;
}
}
Class ClassLoading :
public class ClassLoading {
public static void main (String args[]) {
A a=new A();
a.aDisplay();
}
}
程序运行结果如图:
通过上述示图,我们可以比较清晰的看出java类的整个加载过程。
- 若要加载类A,则先加载执行其父类B(Object)的静态变量以及静态语句块(执行先后顺序按排列的先后顺序)。
- 然后再加载执行类A的静态变量以及静态语句块。(并且1、2步骤只会执行1次)
- 若需实例化类A,则先调用其父类B的构造函数,并且在调用其父类B的构造函数前,依次先调用父类B中的非静态变量及非静态语句块.最后再调用父类B中的构造函数初始化。
- 然后再依次调用类A中的非静态变量及非静态语句块.最后调用A中的构造函数初始化。( 并且3、4步骤可以重复执行)
- 而对于静态方法和非静态方法都是被动调用,即系统不会自动调用执行,所以用户没有调用时都不执行,主要区别在于静态方法可以直接用类名直接调用(实例化对象也可以),而非静态方法只能先实例化对象后才能调用。
Java 中类的加载顺序的更多相关文章
- java 中类的加载顺序(转)
1.虚拟机在首次加载Java类时,会对静态初始化块.静态成员变量.静态方法进行一次初始化 2.只有在调用new方法时才会创建类的实例 3.类实例创建过程:按照父子继承关系进行初始化,首先执行父类的初始 ...
- java中类的加载顺序介绍(ClassLoader)
转自:http://blog.csdn.net/eff666/article/details/52203406 1.ClassNotFoundExcetpion 我们在开发中,经常可以遇见java. ...
- Java中类的加载、连接和初始化
Java中类的加载.连接和初始化 类的加载.连接和初始化 先介绍一下JVM和类 JVM和类: 当我们调用Java命令运行某个Java程序时,该命令将会启动一个Java虚拟机进程,不管该Java程序有多 ...
- java中类的加载情况
当一个类存在继承且与其他类有关联情况时,类中各模块加载顺序如下: 1.首先找到public类,判断该类是否继承其他类,如果没有继承其他类(Object类除外),则加载该类:否则转去加载该类的超类,超类 ...
- JAVA Web.xml 加载顺序
web.xml加载过程(步骤): 1.启动WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener> ...
- Java web.xml加载顺序
web.xml加载过程(步骤): 1.启动WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener&g ...
- java类的加载顺序
related URL: http://www.cnblogs.com/guoyuqiangf8/archive/2012/10/31/2748909.html Parent Class: packa ...
- 从经典面试题看java中类的加载机制
1.概述 类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行,对理解java虚拟机的连接模型和java语言的动态性都有很大帮助. 由于Ja ...
- java中类的加载过程和对象的创建过程
1.类加载过程 首先,jvm在执行时,遇到一个新的类,会先去内存的方法区中去寻找该类的.class文件,如果找到了就直接运行,如果没有找到,则会去硬盘中去寻找该类的.class文件,并将该类文件加载到 ...
随机推荐
- Sublime Text3开发工具安装emmet插件
第一步:Sublime Text导入Package Control 自动安装: 1.打开Sublime Text -->View --> Show Console 菜单打开控制台 2.粘贴 ...
- line-height,vertical-align及图片居中对齐问题根源解析
关于图片居中对齐的问题,进入前端行业虽然有一段时间了,以为自己懂了,可是实际上还是一知半解,找了一些博客来看了一下,但是感觉讲的有点碎,看完还是一知半解. 查阅了一下<css权威指南>,结 ...
- 安装完成Windows服务后自动打开
使用DOS进程开启服务 设置serviceProcessInstaller1控件的Account属性为“LocalSystem”设置serviceInstaller1控件的StartType属性为&q ...
- 用c#开发微信 (11) 微统计 - 阅读分享统计系统 1 基础架构搭建
微信平台自带的统计功能太简单,有时我们需要统计有哪些微信个人用户阅读.分享了微信公众号的手机网页,以及微信个人用户访问手机网页的来源:朋友圈分享访问.好友分享消息访问等.本系统实现了手机网页阅读.分享 ...
- WPF学习开发客户端软件-任务助手(已上传源码)
本人纯属WPF新手,布局和WPF的开发水平相当欠缺,从个人来说,还是比较喜欢WPF的,有人说WPF是界面加上WINFORM,我不这样认为,WPF与WINFORM主要的不同在于数据绑定. 这个软件虽 ...
- 解决dnu restore时的“Cannot handle address family”问题
前几天在使用基于 mono 的 dnx 中的 dnu restore 命令安装 nuget 包包时,遇到了 “Cannot handle address family” 错误,错误详情如下: Cann ...
- KALI LINUX WEB 渗透测试视频教程—第16课 BEEF基本使用
Kali Linux Web 渗透测试视频教程—第16课 BeEF基本使用 文/玄魂 目录 Kali Linux Web 渗透测试视频教程—第16课 BeEF基本使用............... ...
- [ACM_数学] Fibonacci Nim(另类取石子,2-4组合游戏)
游戏规则: 有一堆个数为n的石子,游戏双方轮流取石子,满足: 1)先手不能在第一次把所有的石子取完: 2)之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间(包含1和对手刚取的石子数的2倍). ...
- 深入理解c++构造函数, 复制构造函数和赋值函数重载(operator=)
注 以下代码编译及运行环境均为 Xcode 6.4, LLVM 6.1 with GNU++11 support, Mac OS X 10.10.2 调用时机 看例子 // // main.cpp / ...
- C# 两行代码实现 延迟加载的单例模式(线程安全)
关键代码第4,5行. 很简单的原理不解释:readonly + Lazy(.Net 4.0 + 的新特性) public class LazySingleton { //Lazy singleton ...