【问题标题】:why map's put method is now wokirng directly in class?为什么map的put方法现在直接在课堂上工作了?
【发布时间】:2017-07-10 22:41:14
【问题描述】:
public class Demo{
    Map<String,String> test = new HashMap<String,String>();
    test.put("A","A");
    System.out.println(test);

}

为什么这段代码中不允许put函数?

【问题讨论】:

  • 您必须将该代码放入方法中。
  • 最后两行不会编译,除非你把它们放到实例方法/构造函数/实例初始化器中
  • 你真的不应该在 SO 上发布这样的问题
  • 语句需要在代码块中,例如方法。如果没有 main 方法,您将无法启动程序。
  • 请不要告诉我应该问什么。我知道 2 行不会编译,但我想知道背后的原因。

标签: java core


【解决方案1】:

要在一个类中执行something,你需要在一个本身持有something的类中定义一个方法。

你做了: 类 -> 某事

正确: 类 -> 方法 -> 某事

【讨论】:

  • 这个东西我知道它需要方法来保存东西,我的主要问题是为什么需要方法保存。?
【解决方案2】:

Java 不是这样工作的。如果你想在加载类时实现这个put,你可以尝试使用static 块。

public class Demo{
    static Map<String,String> test = new HashMap<String,String>();
    static{
        test.put("A","A");
        System.out.println(test);
    }
}

或者,如果您希望在每次创建对象时对其进行初始化,请将其保存在适当的构造函数中或仅作为默认执行块(类似于static,但没有static 关键字)。

public class Demo{
    Map<String,String> test = new HashMap<String,String>();
    public Demo(){
        test.put("A","A");
        System.out.println(test);
    }
}

【讨论】:

  • 第一个示例无法编译,因为test 不是静态的。
  • 谢谢。刚刚修好了。
  • 语句块不限于static 上下文。所以你可以保留Map test 作为实例变量
  • 嗯,答案中提到了两种情况。首先,在类加载过程中进行初始化,这种情况下需要是静态的。否则,在创建对象时,在这种情况下,它可以是实例变量并在默认块或适当的构造函数中初始化。
【解决方案3】:

如果您想在对象初始化过程中运行一些代码,请将其放在花括号中:

public class Demo{
    Map<String,String> test = new HashMap<String,String>();

    {   // This is now part of object initialization
        test.put("A","A");
        System.out.println(test);
    }
}

put 或任何其他方法调用都不允许在类声明部分中,因为 Java 不知道何时运行此代码。该语言对运行可执行代码有特定的规则:它要么是方法调用的一部分,要么是对象或类初始化。

花括号中的代码成为对象初始化的一部分。任何时候运行Demo d = new Demo() test 地图都会将{"A", "A"} 插入其中,并且会打印地图本身。请注意,打印输出不会很漂亮。详情请见this Q&A

【讨论】:

  • 我知道这 2 行行不通,但我只是想知道为什么它行不通。
  • 感谢您的回答。
  • 注意:OP 在某个地方仍然需要一个 main 方法。
猜你喜欢
  • 1970-01-01
  • 2020-08-30
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多