简单的Java“新”概念问题

时间:2011-04-05 18:00:51

标签: java

编译器在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);
    }

}

3 个答案:

答案 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书。