`
gao_20022002
  • 浏览: 164821 次
  • 性别: 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++为类对象的初始化 析构以及赋值而提供的特殊支持 为了支持 这些特殊的行为 ...

    颠簸模型文件和模型参数

    此外,模型的权重初始化策略也会影响训练过程,如Xavier初始化或He初始化,这些策略有助于避免梯度消失或爆炸问题。 当我们谈到“tur”这个文件名时,它可能是模型文件、日志文件或某种特定格式的数据文件。由于...

    【老生谈算法】K-means算法matlab是实现.docx

    - 初始化:随机选择K个样本作为初始聚类中心。 - 聚类:将每个样本分配给最近的聚类中心。 - 更新:根据当前聚类情况重新计算聚类中心。 - 检查:检查聚类中心是否发生变化,如果变化不大,则算法收敛;否则回到...

    浅谈java并发之计数器CountDownLatch

    2. 多个组件初始化完成后,主线程再继续执行,确保系统的所有部分都已准备就绪。 3. 控制并发任务的并发度,例如限制同时处理的请求数量。 值得注意的是,CountDownLatch的计数器一旦初始化,就不能再次设置,因此...

    ucos 移植 要点

    这通常涉及到如何初始化任务堆栈、如何保存和恢复上下文等问题。 1. **初始化任务堆栈**:在μC/OS-Ⅱ中,每个任务都有一个独立的堆栈空间。初始化任务堆栈是移植过程中非常重要的一部分,它涉及到设置初始上下文...

    浅谈C语言中循环结构程序设计.pdf

    其中,初始化部分通常用于设置循环变量的初始值,条件部分定义了循环继续的条件,更新部分则在每次循环结束时改变循环变量的值。例如,打印1到10的数字可以这样写: ``` for (int i = 1; i ; i++) { printf("%d ...

    浅谈二级C语言之while语句的说明.pdf

    `int b[N]={9,1,4,2,3,6,5,8,7}`定义了一个整型数组,并初始化其内容。 4. **逻辑判断和条件控制**:在编写while循环时,经常会使用if语句来判断某些条件是否满足,并根据条件执行不同的代码分支。例如,在`if(n==l...

    浅谈C++内存分配及变长数组的动态分配

    - **未初始化的内存引用**:分配成功但未初始化的内存可能导致不可预测的结果,总是初始化新分配的内存。 - **边界超出**:访问超出数组或动态内存分配范围的元素会导致未定义行为。 - **内存泄漏**:忘记释放内存会...

    从一道面试题谈linux下fork的运行机制

    1. **初始化执行:**程序从shell中被调用执行,生成初始进程P0。这是整个执行流程的起点。 2. **第一次fork:**P0执行到`pid1=fork();`时,调用`fork()`函数创建子进程P1,P1继承P0的大部分状态,但获得新的PID。`...

    试谈ORACLE的工作机制.docx

    1. **未加载**(Nomount):在这个阶段,Oracle实例启动并读取初始化参数文件,启动必要的后台进程并分配内存。此阶段可以进行控制文件和数据库的重建操作。 2. **加载**(Mount):实例读取控制文件,从中获取数据...

    试谈终端机功能特点.pdf

    初始化终端机是确保其正常运行的第一步。安装人员需要在开启电源的同时,通过特定按键组合设置终端机的基本参数,如端口号、出纳机号和波特率等。同时,他们还需要知道如何清除设备的存储记录和累计值,以便设备能以...

    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 简介 ..........................................

    浅谈Node.js中的定时器

    在初始化时,会调用 uv_loop_init 函数来初始化 uv_loop_t 类型的变量 default_loop_struct。这个函数首先将 loop 的 time 字段赋值为 0,然后调用 uv_update_time 函数更新最新的计数时间到 loop.time。这样,...

    CUDA.rar_cuda_cuda 例子

    4. **CUDA编程模型**:CUDA程序由主机代码(Host Code)和设备代码(Device Code)组成,主机代码负责初始化、分配内存、复制数据到设备以及启动计算,设备代码则包含CUDA内核函数,执行实际的并行计算。 5. **同步...

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

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

    sesvc.exe 阿萨德

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

Global site tag (gtag.js) - Google Analytics