java - 访问其子类中抽象类的字段/方法/构造函数

标签 java inheritance abstract-class

我试图找出如何在任何子类中访问/使用抽象类的字段/方法,我在网上看到了这个例子。

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 个与此相关的问题 - 很抱歉问了不止一个问题,但它们高度相关。

  1. super() 调用是否需要甚至有效?抽象父类(super class)中没有给出构造函数
  2. 如果抽象类无法实例化,它还能有构造函数吗?
  3. 这个关于this.name的例子中是否需要关键字“this”?
  4. 这里的 play() 重写是什么?当在抽象类中指定一个抽象方法时,这不只是告诉编译器该方法必须由任何子类指定吗?
  5. 如果 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访问StringedInstrumentname,但是你不能访问Instrument namesuper.super.name,因为你不能“链接”super 引用。要直接访问它们,请以不同的方式命名。

但是,您可以在每个类中提供不同名称的 getter 方法,这将提供对每个类的 name 方法的访问。

关于java - 访问其子类中抽象类的字段/方法/构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24789322/

相关文章:

java - 泛型类中的广泛类型删除

java - 从父类(super class) Java 实例化子类

java - Clojure 中用于实现接口(interface)的 Java 类的多态性 - 包装器编写

java - 我该如何解决这个 Java Generics 通配符/抽象歧义问题?

java - 从本地方法抽象内部类扩展后,无法将内部类中的方法设置为私有(private)

java - 如何编写正则表达式来查找以下模式?

java - 如何在 Moqui 框架中配置实体外观以禁用检查实体存在

c++ - 有没有办法在继承构造函数时访问初始化列表?

c++ - 虚函数和模板冲突

java - Google Chrome 插件无法与 Chrome 配合使用