我需要在Java中实现继承的方法吗?

时间:2019-04-19 20:22:20

标签: java inheritance override getter

我是Java的初学者,我有两个真正令我担忧的问题...

  1. @Override是否不是一种重复代码?我的意思是,让我考虑一下情况。 我在Parent类中实现了一个函数。然后,我创建一个Child类,该类从Parent类继承此方法。现在,我可以使用此功能而无需在Child类中再次实现它-它可以工作。但这是一个好习惯吗?还是我应该写@Override并再次实现此功能?
  2. 我是否需要@Override父类中的设置方法和获取方法? (并在Child中实现它们-就像上一个问题一样)。还是在Parent类中它们应该是抽象的? 在此先感谢:)
class Animal { /*Parent class*/
    private int numOfLegs;
    protected String sound;

    public Animal(int numOfLegs, String sound) {
        this.numOfLegs = numOfLegs;
        this.sound = sound;
    }

    public int getNumOfLegs() {
        return numOfLegs;
    }

    public void makeSound() {
        System.out.println(sound);
    }
}

class Dog extends Animal{ /*Child class*/
    public Dog(int numOfLegs, String sound) {
        super(numOfLegs, sound);
    }

    @Override /*Is it necessery to implement an inherited function?*/
    public void makeSound() {
        System.out.println(sound);
    }

    /*Do I need to implement an inherited getter?/*

}

3 个答案:

答案 0 :(得分:2)

顾名思义,重写的重点是重写/替换/更改父方法的行为。用相同的实现覆盖方法是没有意义的。如果您不想更改任何内容,则只能使用继承的方法。

答案 1 :(得分:1)

  

@Override是否不是一种重复代码?

如果重复相同的代码(如在父代码中),则会丢失要覆盖的内容:为父代码已定义的方法定义新代码。

相反,它是关于代码重用的:我们重用有用的东西(我们不会重写的方法,也不想在整个单独的新类中重复的方法),而我们只覆盖需要更改的地方。

  

...这是一个好习惯吗?

重写代码不是一个好习惯,而是修改从父类继承的方法的行为(我们这样做的原因很多)

  

或者也许我应该编写@Override并实现一次此功能   再来一次?

同样,只有在需要时才覆盖该方法。

现在,良好做法是什么,当您覆盖要用 @Override 注释的方法时(如果您不这样做,它也可以使用,但是您将失去编译器可以通过此批注提供的有用信息:例如,检查您实际上是在重写方法,并且由于方法签名与父代方法签名不同而没有创建重载)< / p>

  

我是否需要@Parent类的设置方法和获取方法?

有时,仅在用例需要时,但这种情况并不常见。

  

或者它们应该在Parent类中是抽象的?

关于它们是抽象的,很好,那是一个完全不同的(但我知道是紧密相关的)主题。

仅当父类中没有足够的信息来实现这些方法时(它们取决于具体的实现方式(子类中)),它们才应该是抽象的。

用例示例

大多数鸟会飞,对,其他鸟不会飞:如果我们创建类Bird,我们可以有一个方法getMovement返回“飞”。现在,如果我们创建一个类Penguin,我们将需要覆盖它,因为它们不会飞行。同样在Bird类中,有一个方法getCover返回了“羽毛”,在类Penguin中,我们不需要重写它,因为它们也有羽毛:)

public class Bird {

    // for most birds this is OK, they fly
    public String getMovement() {
        return "Fly";
    }

    public String getCover() {
        return "Feathers";
    }

}

public class Penguin extends Bird {

    // penguins don't fly, so we need to override the parent method in order to create more realistic penguins
    @Override
    public String getMovement() {
        return "Walk";
    }
    //we don't override getCover because penguins do have "Feather"
}

答案 2 :(得分:1)

仅当您要覆盖超类时,才必须从父类覆盖方法。但是当您通过某些类实现Iterface时,必须重写Iterface的所有方法。

因此,如果您不想在Child类中覆盖它,则可以使用Dog类中的某些方法(例如super.makeSound()或Just makeSound()),例如,不发出声音但进行跳跃或其他操作其他。