Java中类的初始化顺序
一、一个类的初始化顺序(没继承情况)
规则:
1.静态变量>普通变量>构造方法
2.变量定义的顺序决定初始化的顺序
3.静态变量和静态块是一样的,普通变量和非静态块是一样的,即能够把静态块看作是静态变量。把非静态块看作是普通变量
public class Test1 {
public static void main(String[] args) {
new D();
}
}
class C{
public C(String s){
System.out.println(s);
}
}
class D{
/* D的构造方法 */
public D(){
System.out.println("D的构造方法");
}
/* D的非静态变量 */
private C c1 = new C("变量1");
private C c2 = new C("变量2");
/* D的静态变量 */
private static C c3 = new C("静态变量1");
private static C c4 = new C("静态变量2");
/* D的静态初始化块 */
static{
System.out.println("D的静态初始化块。
。");
}
/* D的实例初始化块 */
{
System.out.println("D的实例初始化块。。");
}
}
运行结果:
静态变量1
静态变量2
D的静态初始化块。
。
变量1
变量2
D的实例初始化块。
。
D的构造方法
二、一个类的初始化顺序(有继承情况)
规则:
1.父类的初始化>子类的初始化
2.静态变量>普通变量>构造方法
3.变量定义的顺序决定初始化的顺序
4.静态变量和静态块是一样的,普通变量和非静态块是一样的。即能够把静态块看作是静态变量,把非静态块看作是普通变量
public class Test2 {
public static void main(String[] args) {
new B();
}
}
class Feild{
public Feild(String s){
System.out.println(s);
}
}
class A{
/* A的构造方法 */
public A(){
System.out.println("父类的构造方法");
}
/* A的非静态变量 */
private Feild f1 = new Feild("父类变量1");
private Feild f2 = new Feild("父类变量2");
/* A的静态变量 */
private static Feild f3 = new Feild("父类静态变量1");
private static Feild f4 = new Feild("父类静态变量2");
/* A的静态初始化块 */
static{
System.out.println("父类的静态初始化块。。
");
}
/* A的实例初始化块 */
{
System.out.println("父类的实例初始化块。
。");
}
}
class B extends A{
/* B的构造方法 */
public B(){
System.out.println("子类的构造方法");
}
/* B的非静态变量 */
private Feild f5 = new Feild("子类变量1");
private Feild f6 = new Feild("子类变量2");
/* B的静态变量 */
private static Feild f7 = new Feild("子类静态变量1");
private static Feild f8 = new Feild("子类静态变量2");
/* B的静态初始化块 */
static{
System.out.println("子类的静态初始化块。。");
}
/* B的实例初始化块 */
{
System.out.println("子类的实例初始化块。。");
}
}
运行结果:
父类静态变量1
父类静态变量2
父类的静态初始化块。。
子类静态变量1
子类静态变量2
子类的静态初始化块。。
父类变量1
父类变量2
父类的实例初始化块。。
父类的构造方法
子类变量1
子类变量2
子类的实例初始化块。。
子类的构造方法
以下再看一个样例:
public class Test1 {
public static void main(String[] args) {
new D();
}
}
class D{
/* D的构造方法 */
public D(){
System.out.println("D的构造方法");
}
public D(String s){
System.out.println(s);
}
/* D的非静态变量 */
private static D d1 = new D("变量1");
private static D d2 = new D("变量2");
/* D的静态初始化块 */
static{
System.out.println("D的静态初始化块。
。");
}
/* D的实例初始化块 */
{
System.out.println("D的实例初始化块。
。
");
}
}
输出结果为:
D的实例初始化块。。
变量1
D的实例初始化块。。
变量2
D的静态初始化块。
。
D的实例初始化块。
。
D的构造方法
解析:由于new D()时,类D里面会创建两个实例。而又由于静态块的位置在两个实例创建的后面,所以不会先输出静态块的内容。而是创建了两个实例d1、d2后,再new D()。这时才运行静态块、实例块、构造方法。
以下将静态块移到d1和d2创建之前:
public class Test1 {
public static void main(String[] args) {
new D();
}
}
class D{
/* D的构造方法 */
public D(){
System.out.println("D的构造方法");
}
public D(String s){
System.out.println(s);
}
/* D的静态初始化块 */
static{
System.out.println("D的静态初始化块。
。");
}
/* D的非静态变量 */
private static D d1 = new D("变量1");
private static D d2 = new D("变量2");
/* D的实例初始化块 */
{
System.out.println("D的实例初始化块。。
");
}
}
输出结果例如以下:
D的静态初始化块。。
D的实例初始化块。
。
变量1
D的实例初始化块。。
变量2
D的实例初始化块。。
D的构造方法
Java中类的初始化顺序的更多相关文章
- 图示Java类的初始化顺序
Java类的初始化顺序 在开发中,知道Java类的初始化顺序才能让我们更加清楚地掌握程序的执行流程.先把结论贴出来,Java里,从图里的1~6,分别按顺序执行. 以下为代码验证阶段,一共三个类 ...
- java创建对象 的初始化顺序
java创建对象 的初始化顺序 1.初始化块 初始化块通常写在类的构造方法之前,由花括号括起来,通常包含对成员属性进行初始化的语句: 初始化块分为instance初始化块和static初始化块,初始化 ...
- Java学习笔记二十三:Java的继承初始化顺序
Java的继承初始化顺序 当使用继承这个特性时,程序是如何执行的: 继承的初始化顺序 1.初始化父类再初始子类 2.先执行初始化对象中属性,再执行构造方法中的初始化 当使用继承这个特性时,程序是如何执 ...
- java类的初始化顺序
在java中,当我们new一个对象时,对象中的成员,初始化块以及构造方法的加载是有一定的顺序的,看下面一副图: 一.单类(无基类)下的初始化顺序: public class Parent { stat ...
- java中类的初始化和对象的初始化
静态的属于全局静态区,这个部分独立存在,不管是成员还是块,都是静态的,大家地位相等,先到先得. 然后是成员初始化,这个部分在类的构造函数前初始化,因为编译器(或者设计者)可能认为构造函数调用了这个成员 ...
- 【软件构造】-<笔记>-浅谈java中类的初始化过程
编写java程序时,每创建一个新的对象,都会对对象的内容进行初始化. 每一个类的方法中的局部变量都有严格的初始化要求,因此假如写出下面的程序: void f(){ int i; i++; } 编译时就 ...
- [java] java中的初始化顺序
先看程序: package init_cls; class A{ {System.out.println("i am in the class A!");} static { Sy ...
- Java类的初始化顺序 (静态变量、静态初始化块、变量、初始...
很有意思的一篇文章 1.没有继承 静态变量->静态初始化块->变量->变量初始化块->构造方法 2.有继承的情况 父类静态变量->父类静态初始化块->子类静态变量- ...
- Java中的初始化顺序
一.在创建类时为成员变量赋值和在构造函数中的赋值的先后顺序 在未用构造器之前其实已经将类的字段进行了赋值只是在调用构造器时,又将类的字段进行了重新的赋值.如下: package com.cjm.in ...
随机推荐
- C# 使用Linq递归查询数据库遇到的问题及解决方法
User表通常是我们在写"XX管理系统"项目时必须要用到的,有的情况下人员的分类属于树形结构,就是除了最高层和最低层,中间层都有相对的父和子,设计数据库的时候,我们通常会加一个pa ...
- JSON 教程学习进度备忘
书签:跳过:另外跳过的内容有待跟进 __________________ 学习资源:W3School. _________________ 跳过的内容: 1. ______________ 知识点:1 ...
- 前端面试题(JS篇)
原题地址:http://handyxuefeng.blog.163.com/blog/static/454521722013111714040259/ 好吧,最近打算换工作,所以关注比较多的是面试题, ...
- 排列组合+组合数取模 HDU 5894
// 排列组合+组合数取模 HDU 5894 // 题意:n个座位不同,m个人去坐(人是一样的),每个人之间至少相隔k个座位问方案数 // 思路: // 定好m个人 相邻人之间k个座位 剩下就剩n-( ...
- linq性能剖析
Orcas(VS2008&Framework3.5)给我们带来了很多令人兴奋的新特性,尤其是LINQ的引进,可以说方便了一大批开发 人员和框架设计人员.过去,当我们使用O/RMapping的一 ...
- sprite常用操作
,锚点 锚点就是所有旋转,移动,缩放的参考点.cocos2-x中默认的锚点是中心点.锚点用比例来表示范围为0-,(,)点代表左下点,(,)代表右上点.设置的函数为setAnchorPoint(ccp( ...
- virtualenv 和 virtualenvwrapper 实践
virtualenv 首先来聊一下 virtualenv 是个什么鬼. 在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题:亦或者是在开发过程中不想让物理环境里充 ...
- 如何用 redis 造一把分布式锁
基本概念 锁 wiki:In computer science, a lock or mutex (from mutual exclusion) is a synchronization mechan ...
- tty & pty & pts
[tty & pty & pts] 基本概念: 1> tty(终端设备的统称):tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过 ...
- [原创]Devexpress XtraReports 系列 4 创建多栏报表
昨天我们完成了 [原创]Devexpress XtraReports 系列 3 创建主从报表 今天我们继续学习新的一种报表模式:多栏报表.(Demo源码,数据库最后附上) 或许很多人会问什么是多栏报表 ...