0

修改外部类字段的正确方法是什么?当尝试从内部静态类更改时valueArtifact它会出错。需要遍历包含类型对象的数组列表Artifact;并且能够为每个Artifact(无论是硬币还是高脚杯)显示价值。

 public class Artifact {
        public int value = 0;

        public static class  Goblet extends Artifact{
            value = 5; // Syntax error on token "value", VariableDeclaratorId expected after this token
        }
        public static class Coin extends Artifact{
            value = 10;
        }

    }
4

3 回答 3

5

您不能value = xxx;在方法或块之外有语句。

这会起作用:

public class Artifact {

    public static void main(String[] args) {
        Artifact goblet = new Goblet();
        Artifact coin = new Coin();

        System.out.println(goblet.value); //prints 5
        System.out.println(coin.value); //prints 10
    }

    public int value = 0;

    public static class Goblet extends Artifact {

        {value  = 5;}
    }

    public static class Coin extends Artifact {

        {value  = 10;}
    }
}
于 2012-05-29T14:06:36.713 回答
1

首先,这些静态类不是封闭的——它们是静态的。

其次,您不需要封闭的课程,您需要普通的顶级课程。

第三,您需要一个构造函数,Artifact其中传递要使用的值。

试试这个 - 三个单独的类:

public abstract class Artifact {
    public final int value;

    protected Artifact(int value) {
        this.value = value;
    }
}

public class Goblet extends Artifact {
    public Goblet() {
        super(5);
    }
}

public class Coin extends Artifact {
    public Coin() {
        super(10);
    }
}

我选择 makeArtifact abstract所以你不能直接创建一个并且必须创建一个传递值的子类,而构造函数protected只是为了加强这一点(只有子类可以看到它)。

于 2012-05-29T14:16:44.553 回答
0
public class Artifact {
public int value = 0;

public static class Goblet extends Artifact {

    public Goblet() {
        super();
        value = 5;
    }

    public void modifyOuterClassfield(int someValue) {
        value = 100 + someValue;
    }
}

public static class Coin extends Artifact {

    public Coin() {
        super();
        value = 10;

    }   

    public void modifyOuterClassfield(int someValue) {
        value = 100 + someValue;
    }

}

public int getValue() {
    return value;
}

public void setValue(int value) {
    this.value = value;
}

    public static void main(String[] args) {
    Artifact a = new Coin();
    Artifact b = new Goblet();
    Coin c = new Coin();
    Artifact d = new Artifact();

    System.out.println(a.getValue());
    System.out.println(b.value);
    System.out.println(c.getValue());
    System.out.println(d.getValue());

    a.value = 101;
    b.value = 202;
    c.setValue(303);
    d.setValue(404);

    System.out.println(a.getValue());
    System.out.println(b.value);
    System.out.println(c.value);
    System.out.println(d.getValue());
}

}

输出:

10

5

10

0

101

202

303

404

静态类与静态变量不同。因此,实例初始化会起作用,因为编译器不会抱怨,但这不是完整的画面,因为您可以以其他方式初始化变量,除非您的内部类是匿名内部类,因为匿名内部类不能有构造函数。

只要字段未声明为私有,外部类的字段在内部类中始终可见!


http://www.javaworld.com/javaqa/1999-08/01-qa-static2.html

http://www.artima.com/designtechniques/initializationP.html

于 2012-05-29T14:15:21.393 回答