覆盖具有相同名称的方法

时间:2017-09-28 01:24:59

标签: java

所以我有这两个类:

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的设置方式无关。这是正确的方法吗?

3 个答案:

答案 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;
}

也使方法受保护而不是私有

我希望这会有所帮助