当前位置: 首页 > 知识库问答 >
问题:

类的成员何时初始化?[副本]

广楚
2023-03-14

初始化类成员的确切时间?

在下面的代码中:

public class A{
    public  B b = new B();
    private C c = new C(123);

    public A (arg a){
        // Do something
    }

    public someMethod(){
       Log.i(TAG, " "+ b.getD());
    } 
}

main(){
    A a = new A ("xyz"); }

B&C类的对象是什么时候创建的?并且它是否保证被创建?

一个专业的app到底该不该用这样的代码

共有2个答案

景稳
2023-03-14

创建对象时,按以下顺序完成以下事情:

  1. 在堆上使用正确的对象类型分配对象,并且所有实例字段“默认初始化”为0、false或null。
  2. 超(...)中的表达式或此(...)并调用链上下一个类的构造函数。(这将递归到链构造函数,以便首先执行对象构造函数。)
  3. 实例变量初始值设定项和任何实例初始值设定项块将按顺序执行。
  4. 执行构造函数的主体。
  5. 构造函数返回。

希望对你有帮助。

慎峻
2023-03-14

你可以这样分析问题:

class Scratch {
    public static void main(String[] args) {
        A a = new A ("xyz");
    }
}

class A{
    public  B b = new B();
    private C c = new C(123);

    public A (String a){
        System.out.println("new A()");
    }
}

class B {
    public B() {
        System.out.println("new B()");
    }
}

class C {
    public C(int i) {
        System.out.println("new C()");
    }
}

执行时会给出以下输出:

new B()
new C()
new A()

这与Jakir Hossain的答案相符。

所以:内联字段初始化器在构造函数中的代码之前执行,按照它们在中声明的相同顺序执行。

类的BC实例是在A的实例创建中创建的,然后执行A的构造函数。这种排序(和字段的初始化)是有保证的。

 类似资料:
  • 问题内容: 我最近刚与Python中的一个错误作斗争。那是那些愚蠢的新手错误之一,但是它让我思考了Python的机制(我是C ++的老程序员,是Python的新手)。我将列出错误的代码并解释如何解决该问题,然后我有两个问题。 场景:我有一个叫做A的类,它有一个字典数据成员,下面是其代码(当然这是简化的): 使用此代码的类为B类: 请注意,每次调用都会初始化类A的新“干净”实例,并在添加前后打印字典

  • 在C++98标准里,只有static const声明的整型成员能在类内部初始化,并且初始化值必须是常量表达式。这些限制确保了初始化操作可以在编译时期进行。例如: int var = 7; class X { static const int m1 = 7; // 正确 const int m2 = 7; // 错误:无static static int m3 =

  • 问题 你想在类被定义的时候就初始化一部分类的成员,而不是要等到实例被创建后。 解决方案 在类定义时就执行初始化或设置操作是元类的一个典型应用场景。本质上讲,一个元类会在定义时被触发, 这时候你可以执行一些额外的操作。 下面是一个例子,利用这个思路来创建类似于 collections 模块中的命名元组的类: import operator class StructTupleMeta(type):

  • 此代码编译: 该代码不: 报告的错误(在 MSVC、gcc 和 clang 中)表明他们认为 构造函数未定义或不是 ,例如。从叮叮当当: 为什么? (可能与这个问题有关,但在使用时应该是完整的;只有仍然不完整。

  • 本文向大家介绍Visual Basic .NET成员初始化,包括了Visual Basic .NET成员初始化的使用技巧和注意事项,需要的朋友参考一下 示例 每个枚举成员可以用一个值初始化。如果未为成员指定值,则默认情况下将其初始化为0(如果它是成员列表中的第一个成员),或者初始化为比前一个成员的值大1的值。            

  • 主要内容:使用“键值对”初始化结构体,使用多个值的列表初始化结构体,初始化匿名结构体结构体在实例化时可以直接对成员变量进行初始化,初始化有两种形式分别是以字段“键值对”形式和多个值的列表形式,键值对形式的初始化适合选择性填充字段较多的结构体,多个值的列表形式适合填充字段较少的结构体。 使用“键值对”初始化结构体 结构体可以使用“键值对”(Key value pair)初始化字段,每个“键”(Key)对应结构体中的一个字段,键的“值”(Value)对应字段需要初始化的值。 键值对的