`
大师哥
  • 浏览: 16432 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

初始化(转帖)

PHP 
阅读更多

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初始化_混沌初始化_matlab_混沌映射_种群初始化_sin映射初始化粒子群_

    标题中的“SIN初始化_混沌初始化”指的是使用正弦混沌映射对粒子群进行初始位置的设置。混沌系统具有高度的敏感性,使得初始条件的微小差异可能导致显著不同的结果,这为种群的多样性和探索性提供了可能。SIN映射是...

    C++全局变量初始化的一点总结

    静态初始化发生在程序加载时,主要针对那些可以用常量表达的初始化,例如零初始化(zero initialization)和常量初始化(const initialization)。零初始化的变量通常存放在BSS段,而常量初始化的变量则位于数据段,...

    PCI设备BAR空间的初始化

    ### PCI设备BAR空间的初始化详解 #### 一、引言 在现代计算机系统中,PCI(Peripheral Component Interconnect,外围部件互连)总线是一种重要的高速扩展总线标准,广泛应用于连接各种硬件设备,如显卡、声卡、...

    C++构造函数初始化列表

    ### C++构造函数初始化列表详解 在C++编程语言中,构造函数是对象生命周期开始时自动调用的特殊成员函数,用于初始化对象的状态。构造函数初始化列表是C++中一个非常重要的特性,它允许程序员在对象创建时直接对类...

    Java静态初始化块和对象初始化块

    在Java编程语言中,初始化块是程序执行时用于初始化对象或类的重要机制。这里我们将深入探讨两种类型的初始化块:静态初始化块(Static Initializer Block)和对象初始化块(Instance Initializer Block)。这两种...

    LS-DYNA3D中的应力初始化_lsdyna_应力初始化_

    标题中的“应力初始化”是指在进行LS-DYNA3D模拟时,如何设定初始条件中的应力状态。在进行复杂的工程问题模拟时,正确设置初始应力对于获取准确的计算结果至关重要。 应力初始化通常涉及到以下几个关键知识点: 1...

    FANUC机器人初始化系统的基本方法和步骤.docx

    ### FANUC机器人初始化系统的基本方法和步骤 #### 一、引言 FANUC机器人的广泛应用使得其系统的维护与管理变得尤为重要。其中,初始化作为系统恢复的重要手段之一,不仅能够帮助用户解决软件故障问题,还能确保...

    比赛工程2,初始化上行至10层;电梯PLC;好像是六部十层;;

    比赛工程2,初始化上行至10层;电梯PLC;好像是六部十层;;比赛工程2,初始化上行至10层;电梯PLC;好像是六部十层;;比赛工程2,初始化上行至10层;电梯PLC;好像是六部十层;;比赛工程2,初始化上行至10层;电梯PLC...

    Revit+外部工具+无法初始化附加模块“CollaborateDB”,因为程序集C:\Prog+无法初始化附加模块的解决方法

    Revit外部工具无法初始化附加模块的解决方法 大家在安装完Revit或者卸载后重装Revit时是否遇到外部工具无法初始化附加模块的问题,每次打开不停的弹出对话框,烦得要死。 无法初始化附加模块“CollaborateDB”,...

    CSS样式初始化commonInitialize.css

    CSS样式初始化是开发过程中一个重要的步骤,它旨在消除浏览器之间的默认样式差异,确保网页在不同浏览器上的一致性表现。"commonInitialize.css"就是这样一个专门用于全局CSS样式初始化的文件。 首先,我们来理解...

    类继承的初始化顺序类,继承的初始化顺序

    本文详细介绍了类继承中的初始化顺序问题,包括初始化的基本概念、初始化过程中的关键步骤以及如何正确处理基类和子类之间的构造函数调用。理解这些概念对于编写高效、可维护的面向对象程序至关重要。希望通过对这些...

    ARM初始化文件详解

    ARM初始化文件详解 在嵌入式系统开发中,ARM处理器的初始化文件扮演着至关重要的角色。它是系统启动过程中的核心部分,确保硬件正确配置,并为后续的系统加载和运行提供必要的环境。本文将深入探讨ARM初始化文件的...

    详解C++中变量的初始化规则

    定义没有初始化式的变量时,系统有时候会帮我们初始化变量。 系统如何初始化取决于变量的类型以及变量定义的位置。  内置类型变量是否自动初始化取决于变量定义的位置。 函数体外定义的变量初始成0;函数体内定义的...

    SpringBoot项目启动时实现调用一次初始化方法.docx

    在Spring Boot应用中,我们经常需要在项目启动时执行一次初始化操作,比如加载配置、预设数据等。这里我们将详细探讨如何实现这个需求,主要涉及`@PostConstruct`注解、`CommandLineRunner`接口以及在启动类中直接...

    DDR 初始化 流程

    ### DDR初始化流程详解 DDR(Double Data Rate)内存技术在现代计算系统中扮演着至关重要的角色,其高速数据传输能力和高带宽特性使得DDR成为服务器、个人计算机以及各种电子设备中的首选内存类型。DDR初始化流程是...

    VB 数组的初始化实例

    数组的初始化是指在声明数组时为它分配内存并赋予初始值的过程。在VB中,有多种方法可以初始化数组,本篇文章将深入探讨这些方法,并通过实例来说明。 ### 1. 静态初始化 静态初始化是在声明数组的同时为每个元素...

    Nacos 2.1.2 数据库初始化脚本

    Nacos 2.1.2 数据库初始化脚本

    typedef struct 与 struct 的区别及初始化

    初始化结构体时,通常有两种方式:构造函数初始化(如果结构体是类)和成员初始化列表。由于 `struct` 在C++中等同于类,但不支持构造函数,所以我们必须使用成员初始化列表。例如,对于 `PhotoInfo` 结构体,其初始...

    加密狗初始化工具

    2. 运行初始化工具:安装完驱动后,运行提供的初始化工具,该工具会识别加密狗并对其进行设置,使其与特定的软件许可证信息匹配。 3. 配置软件:初始化工具可能会要求用户输入特定的许可证密钥或执行其他配置步骤,...

    M70刀库初始化方法

    三菱系统中的M70刀库初始化方法是针对斗笠式和刀臂式刀库的设置过程。初始化刀库是确保数控机床正常工作的关键步骤,它涉及到机床的启动准备、刀具的定位以及系统的配置。该初始化方法使用特定的M代码来控制整个过程...

Global site tag (gtag.js) - Google Analytics