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

Do I need to implement inherited methods in Java?

我是 Java 的初学者,我有两个真正关心我的问题...

  1. @Override 不是一种代码重复吗?我的意思是,让我考虑一个情况。 我在 Parent class 中实现了一个函数。然后我创建一个从父 class 继承此方法的子 class。现在我可以使用这个函数而无需在 Child class 中再次实现它 - 它有效。但这是一个好习惯吗?或者我应该写@Override 并再次实现这个功能?
  2. 我是否需要@Override 来自父级的 setter 和 getter class? (并在 Child 中实现它们——就像上一个问题一样)。或者他们应该在 Parent class 中是抽象的? 提前致谢:)
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?/*

}

顾名思义,覆盖的重点是 override/replace/change 父方法的行为。用相同的实现覆盖方法是没有意义的。如果你不想改变任何东西,你可以使用继承的方法。

Isn't @Override kind of a code duplication?

如果您复制相同的代码(如在 parent 中),那么您将失去覆盖的意义:为您 parent 已经定义的方法定义一个新代码。

相反,它是关于代码的re-use:我们re-use它有什么用处(我们不覆盖也不想在整个单独的地方重复的方法) new class),我们只覆盖需要更改的部分。

...is it a good practice?

覆盖代码不是一个好的做法,而是修改从 parent class 继承的方法的行为的问题(我们有很多原因这样做)

Or maybe I should write @Override and implement this function once again?

同样,您只在需要时重写该方法。

现在,好的做法 是当您重写一个方法时,您应该用 @Override (如果您不这样做,它也可以工作,但是您将失去编译器可以通过此注释提供的有用信息:例如,检查您实际上是在重写方法而不是创建重载,因为方法签名不同来自 parent)

Do I need to @Override setters and getters from the Parent class?

有时,只有在用例需要时才这样做,但这种情况并不常见。

Or maybe they should be abstract in Parent class?

关于它们是抽象的,嗯,那是一个完全不同(但我知道密切相关)的话题。

只有在 parent class 中没有足够的信息来实现这些方法时,它们才应该是抽象的,这些信息取决于具体实现(在 children classes).

示例用例:

大多数鸟会飞,是的,有些不会:如果我们创建一个 class Bird 我们可以有一个方法 getMovement returns "Fly"。现在,如果我们创建一个 class Penguin,我们 需要 覆盖它,因为它们不会飞。同样在Birdclass中有一个方法getCover,returns"Feathers",在classPenguin中我们没有需要覆盖它,因为它们也有羽毛:)

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"
}

您必须从父 class 覆盖您的方法,只有您想要覆盖超级 class。但是当你用你的一些class.

实现它时,你必须重写Iterface的每一个方法。

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