如何从静态嵌套类修改外部类字段?

时间:2012-05-29 14:04:31

标签: java oop

修改外类字段的正确方法是什么?当尝试从内部静态类更改value Artifact时,它会出错。需要迭代包含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;
        }

    }

3 个答案:

答案 0 :(得分: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;}
    }
}

答案 1 :(得分: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);
    }
}

我选择了Artifact abstract,因此您无法直接创建一个,并且必须创建一个传入值的子类,构造函数为protected只是为了强化(只有子类才能看到它)。

答案 2 :(得分: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