这可能是一个非常基本的问题,但在我学习Java的这个阶段,它使我感到困惑。我有以下代码:
package com.soti84;
import java.util.ArrayList;
public class InvokeMethod {
public static void main(String[] args) {
ArrayList<String> exams= new ArrayList<String>();
exams.add("Java");
exams.add("C#");
}
}如果我移动实例化ArrayList对象的行,并在方法之外调用该对象,则创建该对象的行很好,但不允许对该对象进行add()方法调用。为什么会这样呢?
package com.soti84;
import java.util.ArrayList;
public class InvokeMethod {
ArrayList<String> exams= new ArrayList<String>();
exams.add("Java");
exams.add("C#");
public static void main(String[] args) {
}
}谢谢。
发布于 2016-09-20 09:57:20
您根本不能在方法之外执行该代码。如果您想这样做,您将需要初始化块或静态块。
public class InvokeMethod {
ArrayList<String> exams= new ArrayList<String>();
{
exams.add("Java");
exams.add("C#");
}现在,当您创建一个实例时,将执行该块。如果变量是静态的,则可以使该块保持静态(只需在该块之前添加static )。初始化类时,静态块将执行。当您需要一个填充的静态列表/映射时,这些块非常方便。当然,在编程中方便的一切都可能是一种糟糕的做法,同样,这些块也会被一些人拒绝,它们可能相当危险,并导致难以找到的bug(主要是关于执行的顺序)。
发布于 2016-09-20 10:11:54
在这两个例子中,你试图实现两件完全不同的事情。
在第一个示例中,您在ArrayList方法中声明了main,因此列表的作用域就是这个方法。封闭类与该ArrayList完全没有关联。
在第二个例子中,您尝试在类exams中创建一个名为InvokeMethod的数据成员。这意味着,这个类的每个实例都有自己的列表。
添加元素不起作用,因为“方法之外”只能进行声明和初始化。要解决这个问题,可以使用初始化块
public class InvokeMethod {
ArrayList<String> exams = new ArrayList<String>();
{
exams.add("Java");
exams.add("C#");
}
public static void main(String[] args) {
}
}或者,类的构造函数:
public class InvokeMethod {
ArrayList<String> exams = new ArrayList<String>();
public InvokeMethod() {
exams.add("Java");
exams.add("C#");
}
public static void main(String[] args) {
}
}注意:您还可以通过InvokeMethod类的实例从main方法检索此列表:
public class InvokeMethod {
ArrayList<String> exams = new ArrayList<String>();
public InvokeMethod() {
exams.add("Java");
exams.add("C#");
}
public static void main(String[] args) {
InvokeMethod invokeMethod = new InvokeMethod();
System.out.println(invokeMethod.exams.toString());
invokeMethod.exams.add("Delphi");
System.out.println(invokeMethod.exams.toString());
}
}将打印
[Java, C#]
[Java, C#, Delphi]发布于 2016-09-20 09:58:57
这是因为“您从函数/方法外部调用它”
ArrayList<String> exams= new ArrayList<String>();上面的行意味着您将其声明为对象的属性。这意味着您只能在方法中访问它。
如果你要把下面的内容放进你的主
exams.add("Java");
exams.add("C#"); 这应该工作得很好,尽管你在方法之外宣布了“考试”。
https://stackoverflow.com/questions/39590931
复制相似问题