http://www.1cn.biz/index.php?q=node/423
大家先看下下面这段代码的结果应该是多少?
public class ParentObjectInit {
public void test() {
}
public ParentObjectInit() {
test();
}
public static void main(String[] args) {
new ChildObjectInit();
}
}
class ChildObjectInit extends ParentObjectInit {
private int instanceValue = 20;
public void test() {
System.out.println("instance1 value is: " + instanceValue);
}
}
结果调试出来是20还是0呢?
*******************************************************************
(1)类中属性缺省初始化和显示初始化:
*******************************************************************
public class ParentObjectInit {
public void test() {
}
public ParentObjectInit() {
test();
}
public static void main(String[] args) {
//先调用父类ParentObjectInit 的构造器
new ChildObjectInit();
}
}
class ChildObjectInit extends ParentObjectInit {
//属性显示初始化在调用本类构造器之后
private int instanceValue = 20;
//进入ChildObjectInit类的构造器后,instanceValue值为20
public ChildObjectInit() {
System.out.println("instance1 value is: " + instanceValue);
}
// 在调用ChildObjectInit类构造器前打印
public void test() {
System.out.println("instance1 value is: " + instanceValue);
}
}
过程如下:
上面程序可以说明的是:直到调用完父类ParentObjectInit 的构造方法之后,接着才对其成员变量instanceValue 显式的初始化操作,即将赋值20。
上面代码中的private int instanceValue = 20;定义应看成两部分:第一部分是定义变量,第二部分是给变量赋值。非static属性定义(缺省初始化)位于父类ParentObjectInit 构造方法之前,非static属性显示赋值位于父类ParentObjectInit 构造方法之后。
在父类ParentObjectInit 的构造方法执行时,根据多态性,它会去调用子类中定义的test()方法,可是,这时候,子类中的成员变量还没执行显式初始化操作, 对于private int instanceValue = 20;定义,instanceValue 的值为默认的初始化值0,所以,这时候在test方法中打印出的值为0。
备注:
private int instanceValue = 20;改为static修饰,其结果就是20,因为static属性在构造器调用之前就已经初始化了,并之后不会改变,属于整个类共享。
*******************************************************************
(2)类中对象初始化流程:
*******************************************************************
class Bowl {
Bowl(int marker) {
System.out.println("Bowl(" + marker + ")");
}
}
class Cupboard {
//非静态初始化块
{
Bowl b1 = new Bowl(1);
}
//静态初始化块
static{
Bowl b2 = new Bowl(2);
}
/**
* 非静态实例属性
*/
Bowl b3 = new Bowl(3);
/**
* 静态实例属性
*/
static Bowl b4 = new Bowl(4);
Cupboard() {
System.out.println("Cupboard()");
}
void f3(int marker) {
System.out.println("f3(" + marker + ")");
}
/**
* 静态实例属性
*/
static Bowl b5 = new Bowl(5);
}
class StaticDataInit {
public static void main(String[] args) {
Cupboard t3 = new Cupboard();
t3.f3(1);
}
/**
* 和在main()里面用Cupboard t3 = new Cupboard();结果等价
*/
// static Cupboard t3 = new Cupboard();
}
运行结果为:
Bowl(2) 先调用static初始化块
Bowl(4) 顺序初始化static属性b4和b5
Bowl(5) ...
Bowl(1) 调用非static初始化块
Bowl(3) 调用非static实例属性
Cupboard() 调用类Cupboard的构造器
f3(1) 对象t3调用f3方法
备注:如果将上面程序最后一句 static Cupboard t3 = new Cupboard();
注释解开。
运行结果为:
//static Cupboard t3 = new Cupboard();初始化的结果
Bowl(2)
Bowl(4)
Bowl(5)
Bowl(1)
Bowl(3)
Cupboard()
//创建对象t3并调用方法f3的结果
Bowl(1)
Bowl(3)
Cupboard()
f3(1)
//说明static属性和static块只在对象第一次初始化或static属性第一次初始化时赋值,以后不变
************************************************************************
形如:
public class A{
private int a = 100;
public A(){
//...
}
public static void main(String[] args){
new A();
}
}
//属性a的缺省值为0,在调用构造器A()之前,属性a的值是0。
//仅当调用到构造器A()后才将100显示地赋给属性a,之后再执行构造器中的逻辑。
总结:当一个类A中的对象a初始化时,依次先初始化其static初始化块,static属性,非static初始化块(...)和非static属性(缺省初始化)。然后再调用类A的构造器对A中的属性进行显示初始化
分享到:
相关推荐
标题中的“SIN初始化_混沌初始化”指的是使用正弦混沌映射对粒子群进行初始位置的设置。混沌系统具有高度的敏感性,使得初始条件的微小差异可能导致显著不同的结果,这为种群的多样性和探索性提供了可能。SIN映射是...
本篇将详细讲解与"4.5"TFT初始化相关的知识,特别是针对9481、ILI9338型号的TFT屏幕,以及TFT初始化指令。 首先,"4.5"指的是屏幕的对角线尺寸,这通常用于描述手机或平板电脑等设备的显示屏大小。4.5英寸的TFT屏幕...
静态初始化发生在程序加载时,主要针对那些可以用常量表达的初始化,例如零初始化(zero initialization)和常量初始化(const initialization)。零初始化的变量通常存放在BSS段,而常量初始化的变量则位于数据段,...
### C++构造函数初始化列表详解 在C++编程语言中,构造函数是对象生命周期开始时自动调用的特殊成员函数,用于初始化对象的状态。构造函数初始化列表是C++中一个非常重要的特性,它允许程序员在对象创建时直接对类...
比赛工程2,初始化上行至10层;电梯PLC;好像是六部十层;;比赛工程2,初始化上行至10层;电梯PLC;好像是六部十层;;比赛工程2,初始化上行至10层;电梯PLC;好像是六部十层;;比赛工程2,初始化上行至10层;电梯PLC...
### 柯尼卡美能达7828载体初始化方法详解 #### 一、概述 在使用柯尼卡美能达7828打印机的过程中,可能会遇到需要对载体进行初始化的情况。载体初始化是为了确保打印机能够正常工作并维持打印质量的重要步骤之一。...
Revit外部工具无法初始化附加模块的解决方法 大家在安装完Revit或者卸载后重装Revit时是否遇到外部工具无法初始化附加模块的问题,每次打开不停的弹出对话框,烦得要死。 无法初始化附加模块“CollaborateDB”,...
### FANUC机器人初始化系统的基本方法和步骤 #### 一、引言 FANUC机器人的广泛应用使得其系统的维护与管理变得尤为重要。其中,初始化作为系统恢复的重要手段之一,不仅能够帮助用户解决软件故障问题,还能确保...
CSS样式初始化是开发过程中一个重要的步骤,它旨在消除浏览器之间的默认样式差异,确保网页在不同浏览器上的一致性表现。"commonInitialize.css"就是这样一个专门用于全局CSS样式初始化的文件。 首先,我们来理解...
本文详细介绍了类继承中的初始化顺序问题,包括初始化的基本概念、初始化过程中的关键步骤以及如何正确处理基类和子类之间的构造函数调用。理解这些概念对于编写高效、可维护的面向对象程序至关重要。希望通过对这些...
ARM初始化文件详解 在嵌入式系统开发中,ARM处理器的初始化文件扮演着至关重要的角色。它是系统启动过程中的核心部分,确保硬件正确配置,并为后续的系统加载和运行提供必要的环境。本文将深入探讨ARM初始化文件的...
定义没有初始化式的变量时,系统有时候会帮我们初始化变量。 系统如何初始化取决于变量的类型以及变量定义的位置。 内置类型变量是否自动初始化取决于变量定义的位置。 函数体外定义的变量初始成0;函数体内定义的...
### DDR初始化流程详解 DDR(Double Data Rate)内存技术在现代计算系统中扮演着至关重要的角色,其高速数据传输能力和高带宽特性使得DDR成为服务器、个人计算机以及各种电子设备中的首选内存类型。DDR初始化流程是...
数组的初始化是指在声明数组时为它分配内存并赋予初始值的过程。在VB中,有多种方法可以初始化数组,本篇文章将深入探讨这些方法,并通过实例来说明。 ### 1. 静态初始化 静态初始化是在声明数组的同时为每个元素...
Nacos 2.1.2 数据库初始化脚本
"串口初始化代码分析" 在本文中,我们将对 LPC2366 串口初始化代码进行分析,主要包括波特率计算、管脚配置、工作模式选择、中断寄存器配置等内容。 一、管脚配置 在串口初始化过程中,首先需要配置管脚。这里使用...
vue初始化模板vue初始化模板vue初始化模板vue初始化模板vue初始化模板vue初始化模板vue初始化模板vue初始化模板vue初始化模板vue初始化模板vue初始化模板vue初始化模板vue初始化模板vue初始化模板vue初始化模板vue...
数据开发-数据初始化方案是数据开发中一个重要的步骤,旨在确保订单中心项目顺利上线,把系统及各模块需要的基础信息提前按计划准备、完善。在数据初始化过程中,需要初始化的基础信息可以分为四大类:系统元数据、...
初始化结构体时,通常有两种方式:构造函数初始化(如果结构体是类)和成员初始化列表。由于 `struct` 在C++中等同于类,但不支持构造函数,所以我们必须使用成员初始化列表。例如,对于 `PhotoInfo` 结构体,其初始...
在工业控制系统中,"设备初始化失败"是一个常见的问题,这可能由多种原因引起,例如驱动程序不兼容、系统设置错误、硬件故障或是缺少必要的组件。在本案例中,提到的“组态王设备初始化失败安装可用”指的是,当遇到...