编译器在new Stock[2];
期待后;{
显示错误。
public class TestStockUI {
Stock[] stock = new Stock[2];
stock[0] = new Stock("Microsoft", "MSFT", 15.69);
stock[1] = new Stock("Google", "GOGL", 323.98);
public TestStockUI() { }
}
然后我改变了它,如下所示导致同样的错误。
public class TestStockUI {
Stock[] stock = new Stock[2];
stock[0] = new Stock("Microsoft", "MSFT", 15.69);
stock[1] = new Stock("Google", "GOGL", 323.98);
}
这解决了问题,但我不知道为什么。
public class TestStockUI {
Stock[] stock = new Stock[2];
{
stock[0]=new Stock("Microsoft","MSFT",15.69);
stock[1]=new Stock("Google","GOGL",323.98);
}
}
答案 0 :(得分:13)
{
stock[0]=new Stock("Microsoft","MSFT",15.69);
stock[1]=new Stock("Google","GOGL",323.98);
}
这会创建一个initialization block,这些陈述是合法的。它们在前两个例子中是不合法的。
答案 1 :(得分:4)
您无法在类定义主体中执行代码。
您必须声明属性或方法。另外(在你的情况下)你可以创建自由浮动块,你可以执行代码,这就是为什么前两个不起作用但第三个不起作用的原因。
class A {
private int i;
i = 10; // illegal
}
class A {
private int i;
{ i = 10; } // ok, free floating code
}
创建实例时将执行自由浮动代码块。大多数情况下这是不必要的,因为在类构造函数中这种初始化会更好。
如果与static修饰符一起使用,它将在加载类时执行。
它的一个常见用途是将匿名类替换为构造函数,例如在Swing中,这在构建原型时有点常见。
JPanel p = new JPanel(){{ //<-- free floating code aka double initialization idiom.
add( new JLabel("A"));
add( new JLabel("B"));
}};
答案 2 :(得分:0)
如前所述,初始化在方法构造之外或在块之外是无效的,因为这违反了编程语法。请参考任何好的java书。