[英]Overriding methods with the same name
所以我有这两个类:
家长
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
。如果创建了一个子类实例,它将需要以完全不同的方式设置myVal
,并且与设置父类myVal
方式。 这是正确的方法吗?
子类或SubClass
将覆盖来自父类的任何方法( private
方法除外),最流行的方法是toString
,其中每个类都扩展包含toString()
方法的Object
,但在您的子类中实现的是一个被调用的。
根据应用沙阿在Cruchify ,他提出了一些很好的规则要注意覆盖方法在这里
方法覆盖规则:
在java中,一个方法只能写在子类中,不能写在同一个类中。
参数列表应与重写方法的参数列表完全相同。
返回类型应与超类中原始覆盖方法中声明的返回类型相同或为该返回类型的子类型。
访问级别不能比重写方法的访问级别更严格。 例如:如果超类方法被声明为 public,那么子类中的覆盖方法不能是私有的或受保护的。
实例方法只有在子类继承时才能被覆盖。
声明为 final 的方法不能被覆盖。
声明为静态的方法不能被覆盖,但可以重新声明。
如果一个方法不能被继承,那么它就不能被覆盖。
阅读更多带例子的规则很少,所以你理解它并希望它有所帮助。
私有方法不会被继承。 如果要覆盖父类现有方法的方法,请使用 public 或 protected。
在覆盖的情况下,调用子类的方法。 这解释了多态是如何起作用的。 您可以定义许多不同的类继承相同的接口(或抽象类)。 它们具有不同的实现细节,但可以使用相同的接口进行操作。
首先,您不需要在父类的构造函数中调用setValue(val)
,创建构造函数的最佳方法是使用参数:
public MyClass(int val) {
this.myVal = val;
}
如果想要一个方法在子类中的行为不同,你需要覆盖它:
@Override
protected void setValue(int val){
myVal = val + 1;
}
还使方法受保护而不是私有
我希望这有帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.