繁体   English   中英

为什么我们不能在方法之外填充非静态集合?

[英]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组成,其中包含:

  • LinkedList 类型的名为“list”的variable
  • 一条语句list.add(10);
  • 另一个语句list.add(5);
  • 一个名为“main”的方法包含另外 2 个语句。

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)是一个方法调用,对允许方法调用的位置有限制。 设计一种允许方法调用(和其他语句)与类中的声明交错的语言是完全可能的。 不过,我还没有在任何语言中看到它。 最后它也可能会变得混乱。

允许两个建议:

  1. 在使用LinkedList之前要三思。
  2. 在声明中填充您的列表。

在我 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM