gpt4 book ai didi

java - 主类范围内不允许方法调用

转载 作者:行者123 更新时间:2023-12-03 07:50:29 25 4
gpt4 key购买 nike

为什么我可以在类范围内实例化字段,但不允许在这些字段上调用方法?

public class MethodInFieldTest {
List<Object> list = new ArrayList<>();

// compilation error
// list.add(new Object());

// Compiles just fine, how I usually do it
{
list.add(new Object());
}

// compilation error
// addObject();

public void addObject() {
list.add(new Object());
}


//usual way of handling this
//constructor one
public MethodInFieldTest(... stuff) {
list.add(new Object());
}

//constructor two
public MethodInFieldTest(..) {
list.add(new Object());
}

//etc

//...

//ugly way of doing it
// List<Object> list = new ArrayList<>(Arrays.asList(new Object[]{new Object(), new Object()}));

public static void main(String[] args) {
System.out.println(new MethodInFieldTest().list);
}
}

我经常发现以一些默认值开始一个列表是有意义的,如果我的类中有多个构造函数,我必须在构造函数中添加默认值或使用代码中下面标记的丑陋方式。 “丑陋”的方式适用于列表,但对于需要我的类的默认状态(对象构造函数未提供的状态)的其他对象,我必须使用私有(private)辅助方法。我想知道为什么我不能只在类里面这样做,不一定会带来很大的不便,但我很好奇为什么。

最佳答案

Why can't I do it?

直接的答案是:因为在Java语言规范中是这样规定的:

{
list.add(new Object());
}

是一个instance initializer .这只是一个代码块,在创建类的实例时执行,它可以包含任何真正的 Java 代码。

另一方面,

List<Object> list = new ArrayList<>();

是一个initializer for instance variables .

如果你问“为什么语言规范不允许在类范围内执行 java 代码而不将其放入初始化 block ”,我会说,从技术上讲这是可能的,但这样的代码很难实现阅读和维护——您最终可能会将实例变量声明与任何其他 Java 代码混合使用。使用实例初始化程序时,只有一个代码块会在创建对象时被执行,就像普通方法一样。

注意还有static initializers它们在加载类时执行 - 它们的语法是:

static {
// Java code
// ...
}

如果您能够将任何 Java 代码与实例变量声明混合,您将需要另一种语法来决定代码是否应在类初始化或实例初始化期间执行。

关于java - 主类范围内不允许方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16721139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com