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

问题描述 投票:1回答:3

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

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

}
java inheritance override getter
3个回答
2
投票

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


1
投票

您必须仅从您想要覆盖超类的父类重写您的方法。但是当你的某些类实现它时,你必须覆盖Iterface的每个方法。

所以,如果你不想在Child类中覆盖它,你可以使用Dog类中的某些方法,如super.makeSound()或Just makeSound(),例如,不要发出声音,而是跳转或其他。


1
投票

是不是@Override类的代码重复?

如果复制相同的代码(如在父代中),则会忽略覆盖的目的:为父级已定义的方法定义新代码。

相反,它是关于代码的重用:我们重新使用它有用的东西(我们不覆盖的方法,不想在一个完全独立的新类中重复),我们只覆盖哪些需求要改变。

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

覆盖代码不是一个好习惯,而是修改从父类继承的方法的行为(有很多原因可以解释为什么我们这样做)

或者也许我应该写@Override再次实现这个功能?

同样,如果需要,您只能覆盖该方法。

现在,这是一个好的做法是当你覆盖一个你应该用@Override注释它的方法时(如果你不这样做,它也可以,但是你将失去编译器可以用这个注释给出的有用信息:例如检查您是否实际覆盖了该方法而没有创建重载,因为方法签名与父方法签名不同

我是否需要来自Parent类的@Override setter和getter?

有时候,只有在用例需要的情况下,才会看到这种情况。

或者也许他们应该在父类中抽象?

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

它们应该是抽象的,只有在父类中没有足够的信息来实现那些方法,信息取决于具体的实现(在子类中)。

用例示例:

大多数鸟飞,对,其他一些不飞:如果我们创建一个类Bird我们可以有一个方法getMovement返回“飞”。现在,如果我们创建一个类Penguin,我们需要覆盖它,因为它们不会飞。同样在Bird类有一个方法getCover返回“Feathers”,在类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"
}
© www.soinside.com 2019 - 2024. All rights reserved.