[英]Why can't we have static method in a (non-static) inner class (pre-Java 16)?
[英]Why we cannot populate a non-static collection outside of a method?
我不小心写了这段代码,发现错误:
class Main {
LinkedList<Integer> list = new LinkedList<>();
list.add(10);
list.add(5);
public static void main(String[] args) {
Main myObj = new Main();
System.out.prinln(myObj.list);
}
}
如果我将 LinkedList 声明为静态并将其填充为静态块,则没有错误,或者如果我正在创建一个方法然后在方法中填充列表,则也没有错误。
我是一个初学者,无法理解为什么当我像上面给出的代码那样尝试时它没有被填充。 请解释为第一标准学生。 谢谢!
如果我们分解上面的代码,它由一个名为“Main”的class
组成,其中包含:
variable
list.add(10);
list.add(5);
Java 中的class
是一种语言结构,允许具有某些类型的成员。
java 规范告诉我们一个类可以拥有哪些成员:
类的主体声明成员(字段、方法、类和接口)、实例和静态初始化器以及构造器
https://docs.oracle.com/javase/specs/jls/se16/html/jls-8.html#jls-8.2
上面代码的问题是语句不允许是类的成员。 编译器会拒绝那些。
然而,Java 确实为我们提供了一种在方法之外填充集合的工具。 这是静态初始值设定项
编辑:感谢@Ole VV 和@fps 在这里纠正我
这是一个实例初始化器
类中声明的实例初始值设定项在创建类的实例时执行
https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.6
应用到上面的代码我们可以这样写:
import java.util.LinkedList;
class Main {
LinkedList<Integer> list = new LinkedList<>();
{ // This bracket starts the initializer
list.add(10);
list.add(5);
} // This bracket closes the initializer
public static void main(String[] args) {
Main myObj = new Main();
System.out.println(myObj.list);
}
}
希望这有所帮助 :)
...当我在上面给出的代码中尝试时它没有被填充的原因。
因为 Java 语言就是这样设计的。 list.add(10)
是一个方法调用,对允许方法调用的位置有限制。 设计一种允许方法调用(和其他语句)与类中的声明交错的语言是完全可能的。 不过,我还没有在任何语言中看到它。 最后它也可能会变得混乱。
允许两个建议:
LinkedList
之前要三思。 在我 20 多年的 Java 程序员LinkedList
,我曾经使用过LinkedList
,现在回想起来很后悔。 那个类很少有好的用途。 ArrayList
在时间和空间方面几乎总是更有效。
从 Java 9 开始,如果不需要可修改,您可以以这种方式声明和填充列表:
List<Integer> list = List.of(10, 5);
如果您确实需要稍后修改列表:
List<Integer> list = new ArrayList<Integer>(List.of(10, 5));
同样适用于LinkedList
,顺便说一句。 在 Java 8 及更早版本中,您可以使用Arrays.asList()
,例如:
List<Integer> list = new ArrayList<Integer>(Arrays.asList(10, 5));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.