`
gao_20022002
  • 浏览: 160563 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

继续谈类初始化问题,关于内部类

    博客分类:
  • Java
阅读更多
说明:
昨天看到一篇关于谈类初始化问题的,转载了一下,没有发表成功,现在自己将自己的理解整理了一番,希望探讨一下。

由于前面的一篇文章http://zangweiren.iteye.com/blog/208122没有谈到内部类,现就这个测试一下。

public class TestA {

	static class A {
		static String string1 = "内部类--静态数据";
		String string2 = "内部类--实例数据";
		static {
			System.out.println(string1);
		}
		{
			System.out.println(string2);
		}

	}

	static String string3 = "主类--静态数据";
	String string4 = "主类--实例数据";
	static {
		System.out.println(string3);
	}
	{
		System.out.println(string4);
	}

	public static void main(String[] args) {
		new A();
		System.out.println("---------");
		new TestA();
	}
}



运行上面的代码,会得到如下的结果:
主类--静态数据
内部类--静态数据
内部类--实例数据
---------
主类--实例数据

public class TestA {   
  
    class A {   
        String string1 = "内部类--实例数据";   
        {   
            System.out.println(string1);   
        }   
           
        public A(){   
            System.out.println("内部类--构造器");   
        }   
  
    }   
       
    public TestA(){   
        System.out.println("主类--构造器");   
    }   
  
    static String string2 = "主类--静态数据";   
    String string3 = "主类--实例数据";   
    static {   
        System.out.println(string2);   
    }   
    {   
        System.out.println(string3);   
    }   
  
    public static void main(String[] args) {   
        new TestA().new  A();   
    }   
} 



运行上面的代码,会得到如下的结果:
主类--静态数据
主类--实例数据
主类--构造器
内部类--实例数据
内部类--构造器

可以得出这样的结论:
平常的基础类(即没有继承关系,内部类),初始化顺序:(静态数据|静态块)-->(实例数据|实例块)-->构造器。


继承的类,初始化顺序:继承类首先初始化,如果再次继承以此类推,最顶层类执行(静态数据|静态块),次顶层类执行(静态数据|静态块),以此类推,直至最底层基类,然后最顶层类执行(实例数据|实例块)-->构造器,次顶层类执行(实例数据|实例块)-->构造器,以此类推,直至最底层基类。



内部类(静态)
首先调用静态内部类,初始化顺序:主类(静态变量|静态块)的初始化,静态内部类的(静态数据|静态块)-->(实例数据|实例块)-->构造器,如果再次调用主类,才会初始化主类(实例数据|实例块)-->构造器。
如果首先调用主类,初始化顺序:主类(静态变量|静态块)-->(实例数据|实例块)-->构造器,如果再次调用内部类,初始化顺序:内部类(静态变量|静态块)-->(实例数据|实例块)-->构造器。两个完全是独立的。

内部类(非静态)
初始化顺序:主类(静态变量|静态块)-->(实例数据|实例块)-->构造器,然后内部类(实例数据|实例块)-->构造器。内部类总是与主类的一个对象相绑定。

如果出现两个或者多个内部类,初始化顺序以此类推。
分享到:
评论

相关推荐

    javaSE代码实例

    15.4.3 匿名内部类的初始化 337 15.4.4 匿名内部类作用的体现 337 15.5 理解内部类 339 15.6 内部接口 340 15.6.1 定义在类中的内部接口 340 15.6.2 定义在接口中的内部接口 341 15.7 小结 342 第16...

    21天学通Java-由浅入深

    245 12.3.3 在外部类外访问静态内部类 246 12.4 匿名内部类 247 12.4.1 创建匿名内部类 247 12.4.2 匿名内部类的初始化 249 12.5 综合练习 250 12.6 小结 250 12.7 习题 250 第13章 多线程(精彩视频:55分钟) 252 ...

    C++入门到精通

    接口同私有实现分离 以及怎样定义并封装一个类的对象实例 这一章还有关于类域 嵌 套类 类作为名字空间成员的讨论 第 14 章详细讨论 C++为类对象的初始化 析构以及赋值而提供的特殊支持 为了支持 这些特殊的行为 ...

    Python核心编程(第二版).pdf (压缩包分2部分,第二部分)

     6.4.1 格式化操作符(%)   6.4.2 字符串模板: 更简单的替代品   6.4.3 原始字符串操作符(r/r)   6.4.4 unicode字符串操作符(u/u)   6.5 内建函数   6.5.1 标准类型函数   6.5.2 序列类型...

    Python核心编程(第二版).pdf (压缩包分2部分,第一部分)

     6.4.1 格式化操作符(%)   6.4.2 字符串模板: 更简单的替代品   6.4.3 原始字符串操作符(r/r)   6.4.4 unicode字符串操作符(u/u)   6.5 内建函数   6.5.1 标准类型函数   6.5.2 序列类型...

    PT80-NEAT开发指南v1.1

    第一章 关于本手册........................................................................................................................................ 1 简介 ..........................................

    二十三种设计模式【PDF版】

    状态是编程中经常碰到的实例,将状态对象化,设立状态变换器,便可在状态中轻松切换. 设计模式之 Memento(注释状态?) 很简单一个模式,就是在内存中保留原来数据的拷贝. 设计模式之 Interpreter(解释器) 主要用来对...

    sesvc.exe 阿萨德

    Entry 是 HashMap 中的一个内部类,从他的成员变量很容易看出: key 就是写入时的键。 value 自然就是值。 开始的时候就提到 HashMap 是由数组和链表组成,所以这个 next 就是用于实现链表结构。 hash 存放的是当前...

    Python核心编程第二版(ok)

     3.1.2 继续()   3.1.3 多个语句构成代码组()   3.1.4 代码组由不同的缩进分隔   3.1.5 同一行书写多个语句(;)   3.1.6 模块   3.2 变量赋值   3.2.1 赋值操作符   3.2.2 增量赋值  ...

    C语言入门经典(第4版)--源代码及课后练习答案

    2.3.4 变量的初始化 28 2.3.5 算术语句 28 2.4 变量与内存 34 2.5 整数变量类型 35 2.5.1 无符号的整数类型 35 2.5.2 使用整数类型 36 2.5.3 指定整数常量 37 2.6 浮点数 38 2.7 浮点数变量 38 2.8 使用...

    Python核心编程第二版

     3.1.2 继续(\)   3.1.3 多个语句构成代码组(:)   3.1.4 代码组由不同的缩进分隔   3.1.5 同一行书写多个语句(;)   3.1.6 模块   3.2 变量赋值   3.2.1 赋值操作符   3.2.2 增量赋值 ...

    C#微软培训资料

    14.4 继承中关于属性的一些问题.169 14.5 小 结 .172 第四部分 深入了解 C#.174 第十五章 接 口 .174 15.1 组件编程技术 .174 15.2 接 口 定 义 .177 15.3 接口的成员 .178 15.4 接口的实现 .182 ...

Global site tag (gtag.js) - Google Analytics