Java 访问子类中抽象类的字段/方法/构造函数
我试图找出如何在任何子类中访问/使用抽象类的字段/方法,我在web上遇到了这个示例Java 访问子类中抽象类的字段/方法/构造函数,java,inheritance,abstract-class,Java,Inheritance,Abstract Class,我试图找出如何在任何子类中访问/使用抽象类的字段/方法,我在web上遇到了这个示例 abstract class Instrument { protected String name; abstract public void play(); } abstract class StringedInstrument extends Instrument { protected int numberOfStrings; } 具体的示例子类如下所示 public c
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个与此相关的问题-抱歉问了不止一个问题,但它们高度相关
getName()
进行访问
也就是说,您可以通过强制转换访问受保护的超类字段。注意:通常这是要避免的
ElectricGuitar guitar = new ElectricGuitar();
String guitarName = guitar.name;
String stringInstrumentName = ((StringedInstrument) guitar).name;
String instrumentName = ((Instrument) guitar).name;
super()调用是必需的还是有效的
它不是必需的,但它是有效的。所有构造函数都必须调用一个超类构造函数,无论是显式调用还是隐式调用。如果super()如果没有显式包含code>,编译器会为您插入隐式调用
如果一个抽象类不能被实例化,它甚至可以有一个构造函数吗
是的,抽象类可以有构造函数。它需要被任何子类构造函数调用
在本例中,关于this.name是否需要关键字“this”
这里不需要“this”,因为作用域中没有相同名称的局部变量或参数会隐藏实例变量name
这里覆盖的play()是什么
它正在实现abstract
play()
方法。@Override
注释可用于指示该方法重写或实现超类或接口方法。因为electrickittle
不是abstract
,它确实需要实现play()
,所以这里严格来说不需要@Override
。但是,最好将此注释包含在所有用于重写/实现某个方法的方法中,这样拼写错误或打字错误并不意味着该方法意外地没有重写另一个方法
如果Instrument类、StringedInstrument类和ElectricGuitar类都指定了名为“name”的字段,并且每个字段都有指定的构造函数(如果允许),那么如何在ElectricGuitar类定义中访问每个名称或构造函数
不能直接访问隐藏在超类上方的字段。您可以使用super.name
访问StringedInstrument
的name
,但无法使用super.super.name
访问仪器的name
,因为您无法“链接”super
引用。要直接访问它们,请使用不同的名称
但是,您可以在每个类中提供不同名称的getter方法,这些方法将提供对每个类的name
方法的访问
即使在super类的默认构造函数中什么都不做,最好调用super()
,以防其他开发人员定义默认构造函数并初始化其中的某些内容。你不会想错过的
是的,它可以。但你不能直接打电话。在抽象类中定义构造函数表示任何子类都应该定义一个至少具有super参数的构造函数
只要在较小的范围内没有具有相同名称的变量,就不需要它,但为了清晰起见,建议使用它
不要认为它是凌驾于
之上的。您只需为抽象类提供一个实现。抽象类中的方法只是一个契约。但你必须在你的公司里实施它