说明:
昨天看到一篇关于谈类初始化问题的,转载了一下,没有发表成功,现在自己将自己的理解整理了一番,希望探讨一下。
由于前面的一篇文章
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();
}
}
运行上面的代码,会得到如下的结果:
主类--静态数据
主类--实例数据
主类--构造器
内部类--实例数据
内部类--构造器
可以得出这样的结论:
平常的基础类(即没有继承关系,内部类),初始化顺序:(静态数据|静态块)-->(实例数据|实例块)-->构造器。
继承的类,初始化顺序:继承类首先初始化,如果再次继承以此类推,最顶层类执行(静态数据|静态块),次顶层类执行(静态数据|静态块),以此类推,直至最底层基类,然后最顶层类执行(实例数据|实例块)-->构造器,次顶层类执行(实例数据|实例块)-->构造器,以此类推,直至最底层基类。
内部类(静态)
首先调用静态内部类,初始化顺序:主类(静态变量|静态块)的初始化,静态内部类的(静态数据|静态块)-->(实例数据|实例块)-->构造器,如果再次调用主类,才会初始化主类(实例数据|实例块)-->构造器。
如果首先调用主类,初始化顺序:主类(静态变量|静态块)-->(实例数据|实例块)-->构造器,如果再次调用内部类,初始化顺序:内部类(静态变量|静态块)-->(实例数据|实例块)-->构造器。两个完全是独立的。
内部类(非静态)
初始化顺序:主类(静态变量|静态块)-->(实例数据|实例块)-->构造器,然后内部类(实例数据|实例块)-->构造器。内部类总是与主类的一个对象相绑定。
如果出现两个或者多个内部类,初始化顺序以此类推。
分享到:
相关推荐
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...
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 ...
接口同私有实现分离 以及怎样定义并封装一个类的对象实例 这一章还有关于类域 嵌 套类 类作为名字空间成员的讨论 第 14 章详细讨论 C++为类对象的初始化 析构以及赋值而提供的特殊支持 为了支持 这些特殊的行为 ...
此外,模型的权重初始化策略也会影响训练过程,如Xavier初始化或He初始化,这些策略有助于避免梯度消失或爆炸问题。 当我们谈到“tur”这个文件名时,它可能是模型文件、日志文件或某种特定格式的数据文件。由于...
- 初始化:随机选择K个样本作为初始聚类中心。 - 聚类:将每个样本分配给最近的聚类中心。 - 更新:根据当前聚类情况重新计算聚类中心。 - 检查:检查聚类中心是否发生变化,如果变化不大,则算法收敛;否则回到...
2. 多个组件初始化完成后,主线程再继续执行,确保系统的所有部分都已准备就绪。 3. 控制并发任务的并发度,例如限制同时处理的请求数量。 值得注意的是,CountDownLatch的计数器一旦初始化,就不能再次设置,因此...
这通常涉及到如何初始化任务堆栈、如何保存和恢复上下文等问题。 1. **初始化任务堆栈**:在μC/OS-Ⅱ中,每个任务都有一个独立的堆栈空间。初始化任务堆栈是移植过程中非常重要的一部分,它涉及到设置初始上下文...
其中,初始化部分通常用于设置循环变量的初始值,条件部分定义了循环继续的条件,更新部分则在每次循环结束时改变循环变量的值。例如,打印1到10的数字可以这样写: ``` for (int i = 1; i ; i++) { printf("%d ...
`int b[N]={9,1,4,2,3,6,5,8,7}`定义了一个整型数组,并初始化其内容。 4. **逻辑判断和条件控制**:在编写while循环时,经常会使用if语句来判断某些条件是否满足,并根据条件执行不同的代码分支。例如,在`if(n==l...
- **未初始化的内存引用**:分配成功但未初始化的内存可能导致不可预测的结果,总是初始化新分配的内存。 - **边界超出**:访问超出数组或动态内存分配范围的元素会导致未定义行为。 - **内存泄漏**:忘记释放内存会...
1. **初始化执行:**程序从shell中被调用执行,生成初始进程P0。这是整个执行流程的起点。 2. **第一次fork:**P0执行到`pid1=fork();`时,调用`fork()`函数创建子进程P1,P1继承P0的大部分状态,但获得新的PID。`...
1. **未加载**(Nomount):在这个阶段,Oracle实例启动并读取初始化参数文件,启动必要的后台进程并分配内存。此阶段可以进行控制文件和数据库的重建操作。 2. **加载**(Mount):实例读取控制文件,从中获取数据...
初始化终端机是确保其正常运行的第一步。安装人员需要在开启电源的同时,通过特定按键组合设置终端机的基本参数,如端口号、出纳机号和波特率等。同时,他们还需要知道如何清除设备的存储记录和累计值,以便设备能以...
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 序列类型...
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 序列类型...
第一章 关于本手册........................................................................................................................................ 1 简介 ..........................................
在初始化时,会调用 uv_loop_init 函数来初始化 uv_loop_t 类型的变量 default_loop_struct。这个函数首先将 loop 的 time 字段赋值为 0,然后调用 uv_update_time 函数更新最新的计数时间到 loop.time。这样,...
4. **CUDA编程模型**:CUDA程序由主机代码(Host Code)和设备代码(Device Code)组成,主机代码负责初始化、分配内存、复制数据到设备以及启动计算,设备代码则包含CUDA内核函数,执行实际的并行计算。 5. **同步...
状态是编程中经常碰到的实例,将状态对象化,设立状态变换器,便可在状态中轻松切换. 设计模式之 Memento(注释状态?) 很简单一个模式,就是在内存中保留原来数据的拷贝. 设计模式之 Interpreter(解释器) 主要用来对...
Entry 是 HashMap 中的一个内部类,从他的成员变量很容易看出: key 就是写入时的键。 value 自然就是值。 开始的时候就提到 HashMap 是由数组和链表组成,所以这个 next 就是用于实现链表结构。 hash 存放的是当前...