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

在Java中使用初始化程序与构造方法

洪鸿博
2023-03-14
问题内容

因此,最近我一直在提高自己的Java技能,并且发现了一些以前不了解的功能。静态和实例初始化程序是两种这样的技术。

我的问题是,何时将使用初始化程序而不将代码包含在构造函数中?我想到了几个明显的可能性:

  • 静态/实例初始值设定项可用于设置“最终”静态/实例变量的值,而构造函数不能

  • 静态初始值设定项可用于设置类中任何静态变量的值,该值应比在每个构造函数的开头使用“ if(someStaticVar == null)//做东西”代码块更有效。

这两种情况都假定设置这些变量所需的代码比简单地“ var = value”更为复杂,否则在声明变量时似乎没有任何理由使用初始化程序而不是简单地设置值。

然而,尽管这些并不是微不足道的收益(尤其是设置最终变量的能力),但似乎确实有少数情况下应该使用初始化器。

当然,在构造函数中可以完成很多事情,但是可以使用初始化程序,但是我真的不知道这样做的原因。即使一个类的所有构造函数都共享大量代码,使用私有的initialize()函数对我来说似乎比使用初始化程序更有意义,因为在编写新代码时,它不会使你锁定代码运行构造函数。

我想念什么吗?在其他情况下,应该使用初始化程序吗?还是在非常特定的情况下使用它真的只是一个相当有限的工具?


问题答案:

静态初始化程序对于cletus很有用,我以相同的方式使用它们。如果你有一个静态变量要在加载类时进行初始化,则可以使用静态初始值设定项,尤其是因为它允许你执行复杂的初始化并且仍然具有静态变量be final。这是一个巨大的胜利。

我发现“ if(someStaticVar == null)//做东西”是混乱且容易出错的。如果它是静态初始化并声明的final,则避免了被初始化的可能性null。

但是,当你说:

静态/实例初始值设定项可用于设置“最终”静态/实例变量的值,而构造函数不能

我假设你同时在说:

  • 静态初始值设定项可用于设置“最终”静态变量的值,而构造函数不能
  • 实例初始化器可用于设置“最终”实例变量的值,而构造函数不能
    而你在第一点上是正确的,在第二点上是错误的。例如,你可以执行以下操作:
class MyClass {
    private final int counter;
    public MyClass(final int counter) {
        this.counter = counter;
    }
}

同样,当构造函数之间共享大量代码时,处理此问题的最佳方法之一是链接构造函数,并提供默认值。这很清楚地表明正在做什么:

class MyClass {
    private final int counter;
    public MyClass() {
        this(0);
    }
    public MyClass(final int counter) {
        this.counter = counter;
    }
}


 类似资料:
  • 我试图从WebClient中替换RestTemplate,因为根据Java文档,RestTemple将被弃用。Spring团队建议尽可能使用WebClient。 之前的RestTempalte代码如下 我想从WebClient替换RestTemplate。所以我实现了类WebClientConnection,如下所示 我使用这个依赖项 Webclient create 上有堆栈溢出错误 如何正确地

  • 问题内容: 在Java中,但是在其他OO语言中,初始化属性定义之间也有区别,例如 并使用构造函数对其进行初始化? 我想不出任何实际的区别,有没有?否则,即使结果相同,是否存在一种方法优于另一种方法的情况? 问题答案: 初始化顺序在这里很重要。 将字段设置为默认初始值(0,false,null) 调用对象的构造函数(但不要执行构造函数的主体) 调用超类的构造函数 使用初始化程序和初始化块初始化字段

  • 我想在构造函数中初始化二维数组。但是,我在类中声明数组的实例变量时遇到了一个问题。如果我这样做就错了: 我怎么解决这个问题?

  • 问题内容: 知道为什么for循环初始化程序中的此struct表达式在编译时会导致语法错误吗?在这种情况下,指向struct的指针工作正常,但是我需要像波纹管这样的局部变量。感谢您的建议! 问题答案: 简化您的代码: 给出编译时错误: 预期的布尔值或范围表达式,找到简单的语句(缺少复合文字周围的括号?)(以及另外1个错误) 该构造难以解析。不管是复合文字的一部分还是语句本身( 块)的开头括号,开头括

  • 问题内容: 我的课看起来像这样: 在FXMLLoader创建相应的控制器(在所给出的实例经由文件通过调用第一默认构造,然后)方法: 输出为: 那么,为什么存在这种方法呢?使用构造函数或方法初始化控制器所需的东西有什么区别? 问题答案: 简而言之:首先调用构造函数,然后@FXML填充所有带注释的字段,然后再调用。因此,构造函数无权访问引用文件中定义的组件的字段,而有权访问它们。 引用FXML简介:

  • 问题内容: 如果未将ArrayList初始化为字段,则将项目添加到ArrayList时出现NullPointerException。谁能解释为什么? 当我将ArrayList初始化为字段时起作用: 当我将ArrayList声明为字段然后在Class构造函数中对其进行初始化时,它不起作用: 问题答案: 因为构造函数中的版本正在创建一个新变量,而该变量恰好与您的成员字段名称相同,而成员字段仍未设置。这