当前位置: 首页 > 面试题库 >

Java我应该在声明中还是在构造函数中实例化实例变量?

鲁才艺
2023-03-14
问题内容

这两种方法有什么优势吗?

范例1:

class A {
    B b = new B();
}

范例2:

class A {
    B b;

    A() {
         b = new B();
    }
}

问题答案:
  • 没有区别-实例变量初始化实际上是由编译器放入构造函数中的。
  • 第一种变体更具可读性。
  • 你不能使用第一个变体进行异常处理。
  • 另外还有初始化块,编译器也将其放在构造函数中:
{
    a = new A();
}

但是,字段声明不是任何方法的一部分,因此它们不能像语句那样执行。相反,Java编译器会自动生成实例字段初始化代码,并将其放入该类的一个或多个构造函数中。初始化代码按照在源代码中出现的顺序插入到构造函数中,这意味着字段初始化器可以使用在其之前声明的字段的初始值。

此外,你可能需要延迟初始化字段。如果初始化字段是一项昂贵的操作,则可以在需要时立即对其进行初始化:

ExpensiveObject o;

public ExpensiveObject getExpensiveObject() {
    if (o == null) {
        o = new ExpensiveObject();
    }
    return o;
}

最终(如Bill所指出的那样),为了进行依赖管理,最好避免new在类中的任何地方使用运算符。相反,最好使用“ 依赖注入” -即让其他人(另一个类/框架)实例化并将依赖注入到你的类中。



 类似资料:
  • 问题内容: 这行得通吗? 我只是想弄清楚构造函数。如果将其称为方法,那么我认为它的工作原理与方法类似。您可以在调用该方法时使用的方法中创建局部变量,因此我不明白为什么在构造函数使用它们之前必须先声明实例变量。 问题答案: 在您的示例中,速度和权重不是实例变量,因为它们的范围仅限于构造函数。您可以在外部声明它们,以使它们在整个类(即整个类的对象)中可见。构造函数的目的是初始化它们。 例如以这种方式:

  • 问题内容: 当我基于C ++知识使用Java时,我喜欢使用以下方式初始化变量。 一段时间后,我改变了习惯 我碰到了其他源代码,有些使用1st约定,有些使用2nd约定。 我可以知道大家都推荐哪种惯例,为什么? 问题答案: 我发现第二种样式(一口气声明和初始化)更出色。原因: 一目了然,该变量是如何初始化的。通常,在读取程序并遇到变量时,首先会去声明它(在IDE中通常是自动的)。使用样式2,你会立即看

  • 问题内容: 在React / React-Native中使用ES6 +语法,当 在构造函数外部 定义变量时,通过调用将其转换为实例变量。我的主张正确吗?如果在构造函数中未实例化,为什么它甚至还能工作?这里是相应的React Native代码片段: 关于ES7属性初始化器的讨论显示了如何在React / React Native中以这种方式显着使用变量。 到目前为止,相关的堆栈溢出讨论我通读不能回答

  • 问题内容: 嗨,我在使用Java进行初始化时遇到问题,以下代码给了我一个编译错误,叫做:Expected instanceInt = 100; 但我已经宣布了 如果这些东西与堆栈和堆的东西有关,请用简单的术语进行解释,我是Java的新手,并且我对这些领域不了解。 问题答案: 您不能在课程中间使用语句。它必须与声明位于同一块或同一行中。 做您想要的事情的常用方法是: 声明期间的初始化 } 通常,如果

  • 问题内容: 如何从Java的构造函数中获取实例化对象? 我想为某些GUI类存储对父对象的引用,以模拟事件冒泡-调用父处理程序-但我不想更改所有现有代码。 问题答案: 简短的回答:Java没有办法做到这一点。(您可以找到哪个班级叫您,但以下较长的答案在大多数情况下也适用于您。) 长话大说:依赖于被调用的地方,魔术地表现不同的代码几乎总是一个坏主意。这会使必须维护您代码的人感到困惑,并且严重损害了您的

  • 我正在从事一个C语言的项目,当我显式实例化模板类时,很难理解模板类的哪些成员被显式实例化。我编写了以下文件,然后使用Visual C 2008 Express Edition的发布配置编译该文件,然后将其放入反汇编程序。 忽略这个文件目前并不真正需要模板,这可以很好地编译。我将exe放入反汇编程序,它告诉我该测试 这导致测试