所以我有这两个类:
父
public class MyClass {
protected int myVal;
public MyClass(int val) {
setMyVal(val);
}
private void setMyVal(int val) {
myVal = val;
}
}
子
public class SubClass extends MyClass {
public SubClass(int val) {
super(val);
}
private void setMyVal(int val) {
myVal = val + 1;
}
}
创建子类时将调用哪个setMyVal
?
我有很多子类需要将myVal
设置为具有不同的逻辑,包括父类。
因此,例如,如果我创建父类实例,则需要将myVal
简单地设置为传入的val
。如果创建了子类实例,则需要设置{{1以完全不同的方式,与父类myVal
的设置方式无关。这是正确的方法吗?
答案 0 :(得分:1)
子类或SubClass
将覆盖来自父类的任何方法(除了private
个),最受欢迎的方法是toString
,其中每个类都扩展{{1}其中包含Object
方法,但在您的子类中实现的方法是被调用的方法。
根据App Shah在Cruchify中的说法,他提出了一些很好的规则,可以在重写方法时注意here
方法覆盖规则:
在java中,方法只能用Subclass编写,而不能写在同一个类中。
参数列表应与被覆盖的列表完全相同 方法。
返回类型应与返回的相同或子类型相同 在超类中的原始重写方法中声明的类型。
访问级别不能比被覆盖的更严格 方法的访问级别。例如:如果超类方法是 声明公共然后子类中的重写方法不能 无论是私人的还是受保护的。
只能覆盖实例方法 如果它们是由子类继承的。
声明final的方法不能 被覆盖。
声明为static的方法无法覆盖,但可以 被重新宣布。
如果某个方法无法继承,则不能继承 重写的。
Read more很少有例子的规则,所以你理解它并希望它有所帮助。
答案 1 :(得分:1)
不会继承私有方法。如果要覆盖父类的现有方法的方法,请使用public或protected。
在覆盖的情况下,调用子类的方法。这解释了多态如何发挥作用。 您可以定义许多继承相同接口(或抽象类)的不同类。它们具有不同的实现细节,但可以使用相同的界面进行操作。
答案 2 :(得分:-2)
首先,您不需要在父类的构造函数中调用setValue(val)
创建构造函数的最佳方法是使用参数:
public MyClass(int val) {
this.myVal = val;
}
如果希望方法的行为在子类中不同,则需要覆盖它:
@Override
protected void setValue(int val){
myVal = val + 1;
}
也使方法受保护而不是私有
我希望这会有所帮助