修改外类字段的正确方法是什么?当尝试从内部静态类更改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;
}
}
答案 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
静态类与静态变量不同。因此,实例初始化将起到作用,因为编译器不会抱怨,但它不是完整的图片,因为你可以用其他方式初始化变量,除非你的内部类是匿名内部类,因为匿名内部类不能有构造
外部类的字段在内部类中始终可见,只要字段未声明为私有字段即可!