【问题标题】:How to set inherited variable in java?如何在java中设置继承变量?
【发布时间】:2011-12-08 00:46:18
【问题描述】:
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”。??
【问题讨论】:
标签:
java
class
inheritance
extends
【解决方案1】:
我认为这里的大多数答案都归结为风格偏好。
对于这样的小例子,大多数提供的解决方案都可以正常工作。
但是,让我们假设您有一个深几级的继承树。在这种情况下,可能很难理解每个属性的来源,因此使用 setter、getter 和对超类的引用可能会派上用场。我个人的选择如下:
public class Atribut {
private int firstProp;
private int thirdProp;
public int getFirstProp() {
return firstProp;
}
public void setFirstProp(int firstProp) {
this.firstProp = firstProp;
}
....
@Override
public String toString() {
return Integer.toString(this.getFirstProp()) +
Integer.toString(this.getThirdProp());
}
}
public class Cas extends Atribut {
private int secondProp;
public Cas() {
super.setFirstProp(1);
this.setSecondProp(2);
super.setThirdProp(3);
}
}
使用上面提供的方法的替代实现将产生这个 Cas 类:
public Cas() {
super(1, 3)
secondProp = 2;
}
第二种解决方案有点难以阅读,并且对您设置的属性的描述性较差。
出于这些原因,这是我更喜欢的风格。此外,重申一下,对于更复杂的示例,第一种方法的好处变得更加明显。
【解决方案2】:
就像@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()就好了。
【解决方案3】:
如果子类中的变量已经在父类中可用,为什么要在子类中隐藏它?为什么不使用相同的变量?
如果您使用相同的变量,问题会自动解决。如果必须继承属性,请不要复制它。
【解决方案4】:
我对这类事情的首选技术是使用构造函数参数:
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);
}
}
【解决方案5】:
当您隐藏变量时,父类中的变量将用于那里的方法。
如果你想这样做,我会这样做
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
}