public class Atribut {
int classid;
@Override public String toString() {
return Integer.toString(classid);
}
}
我创建了这个覆盖方法toString()的类。我计划制作许多具有不同classid的子类。问题是我不知道如何设置变量classid在toString方法中工作。
public class cas extends Atribut{
int classid=2;
}
问题是如果我创建一个cas对象和toString方法,它返回“0”而不是“2”。??
答案 0 :(得分:8)
我喜欢这种方法的技巧是使用构造函数参数:
public class Parent {
// Using "protected final" so child classes can read, but not change it
// Adjust as needed if that's not what you intended
protected final int classid;
// Protected constructor: must be called by subclasses
protected Parent(int classid) {
this.classid = classid;
}
@Override
public String toString() {
return Integer.toString(classid);
}
}
public class Child extends Parent {
public Child() {
// The compiler will enforce that the child class MUST provide this value
super(2);
}
}
答案 1 :(得分:3)
就像@java_mouse推荐的那样,只需使用父类的变量。
public class Atribut {
protected int classid;
public Atribut() {
classid = 0;
}
@Override
public String toString() {
return Integer.toString(classid);
}
}
public class Cas extends Atribut{
public Cas() {
classid = 2;
}
}
在构造函数中设置classid
的值,然后就可以使用超类的toString()
了。
答案 2 :(得分:2)
当您隐藏变量时,父类中的变量将用于那里的方法。
如果你想这样做,我会这样做
class Atribut {
int classid = 0;
protected int classid() { return classid; } // points to Attribut.classid
public String toString() {
return Integer.toString(classid());
}
}
然后在您的子类中,您可以覆盖方法
class cas {
int classid = 2;
protected int classid() { return classid; } // points to cas.classid
}
答案 3 :(得分:1)
如果父类中已存在变量,为什么要在子类中隐藏变量?为什么不使用相同的变量?
如果您使用相同的变量,则问题会自动解决。如果必须继承属性,请不要复制该属性。