谈到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?/*
}
顾名思义,覆盖点是覆盖/替换/更改父方法的行为。覆盖具有相同实现的方法没有意义。如果您不想更改任何内容,可以使用继承的方法。
您必须仅从您想要覆盖超类的父类重写您的方法。但是当你的某些类实现它时,你必须覆盖Iterface的每个方法。
所以,如果你不想在Child类中覆盖它,你可以使用Dog类中的某些方法,如super.makeSound()或Just makeSound(),例如,不要发出声音,而是跳转或其他。
是不是@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"
}