我是Java的初学者,我有两个真正令我担忧的问题...
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?/*
}
答案 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()),例如,不发出声音但进行跳跃或其他操作其他。