我需要在 Java 中实现继承方法吗?
Do I need to implement inherited methods in Java?
我是 Java 的初学者,我有两个真正关心我的问题...
- @Override 不是一种代码重复吗?我的意思是,让我考虑一个情况。
我在 Parent class 中实现了一个函数。然后我创建一个从父 class 继承此方法的子 class。现在我可以使用这个函数而无需在 Child class 中再次实现它 - 它有效。但这是一个好习惯吗?或者我应该写@Override 并再次实现这个功能?
- 我是否需要@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
,我们 需要 覆盖它,因为它们不会飞。同样在Bird
class中有一个方法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() ,例如不要发出声音但要跳跃或其他东西。
我是 Java 的初学者,我有两个真正关心我的问题...
- @Override 不是一种代码重复吗?我的意思是,让我考虑一个情况。 我在 Parent class 中实现了一个函数。然后我创建一个从父 class 继承此方法的子 class。现在我可以使用这个函数而无需在 Child class 中再次实现它 - 它有效。但这是一个好习惯吗?或者我应该写@Override 并再次实现这个功能?
- 我是否需要@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
,我们 需要 覆盖它,因为它们不会飞。同样在Bird
class中有一个方法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() ,例如不要发出声音但要跳跃或其他东西。