我试图找出如何在任何子类中访问/使用抽象类的字段/方法,我在网上看到了这个例子。
abstract class Instrument {
protected String name;
abstract public void play();
}
abstract class StringedInstrument extends Instrument {
protected int numberOfStrings;
}
给出具体的例子子类
public class ElectricGuitar extends StringedInstrument {
public ElectricGuitar() {
super();
this.name = "Guitar";
this.numberOfStrings = 6;
}
public ElectricGuitar(int numberOfStrings) {
super();
this.name = "Guitar";
this.numberOfStrings = numberOfStrings;
}
@Override
public void play() {
System.out.println("An electric " + numberOfStrings + "-string " + name
+ " is rocking!");
}
}
我有 5 个与此相关的问题 - 很抱歉问了不止一个问题,但它们高度相关。
- super() 调用是否需要甚至有效?抽象父类(super class)中没有给出构造函数
- 如果抽象类无法实例化,它还能有构造函数吗?
- 这个关于this.name的例子中是否需要关键字“this”?
- 这里的 play() 重写是什么?当在抽象类中指定一个抽象方法时,这不只是告诉编译器该方法必须由任何子类指定吗?
- 如果 Instrument 类、StringedInstrument 类和 ElectricGuitar 类都指定了名为“名称”的字段,并且每个字段都有指定的构造函数(如果允许),那么如何在 ElectricGuitar 类定义中访问每个名称或构造函数。
最佳答案
Is the super() call needed or even valid?
它不是必需的,但它是有效的。所有构造函数都必须调用父类(super class)构造函数,可以像您所做的那样显式调用,也可以隐式调用。如果未显式包含 super();
,编译器会为您插入一个隐式调用。
Can an abstract class even have a constructor given that it can't be instantiated?
是的,一个抽象类可以有一个构造函数。它需要被任何子类构造函数调用。
Is the keyword "this" necessary in this example concerning this.name?
“this”在这里不是必需的,因为范围内没有局部变量或参数,同名的,会隐藏实例变量name
。
What is the play() overriding here?
它正在实现 abstract
play()
方法。 @Override
注释可用于指示该方法覆盖或实现父类(super class)或接口(interface)方法。因为 ElectricGuitar
不是 abstract
,它确实需要实现 play()
,所以 @Override
不是绝对必要的这里。但是,最好将此注释包含在所有旨在重写/实现某个方法的方法中,这样拼写错误或拼写错误并不意味着该方法意外不会重写另一个方法。
If the Instrument class, StringedInstrument class, and ElectricGuitar class all specified fields called "name" and each had specified constructors (if allowed) how would each name or constructor be accessed in the ElectricGuitar class definition?
您不能直接访问隐藏在父类(super class)之上的字段。你可以用super.name
访问StringedInstrument
的name
,但是你不能访问Instrument
的 name
和 super.super.name
,因为你不能“链接”super
引用。要直接访问它们,请以不同的方式命名。
但是,您可以在每个类中提供不同名称的 getter 方法,这将提供对每个类的 name
方法的访问。
关于java - 访问其子类中抽象类的字段/方法/构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24789322/