Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 访问子类中抽象类的字段/方法/构造函数_Java_Inheritance_Abstract Class - Fatal编程技术网

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

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

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

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()调用是必需的还是有效的?。抽象超类中没有给定构造函数
  • 如果一个抽象类不能被实例化,它甚至可以有一个构造函数吗
  • 在本例中,关于this.name是否需要关键字“this”
  • 这里覆盖的play()是什么?当抽象类中指定了一个抽象方法时,这难道不是告诉编译器该方法必须由任何子类指定吗
  • 如果Instrument类、StringedInstrument类和ElectricGuitar类都指定了名为“name”的字段,并且每个字段都有指定的构造函数(如果允许),那么如何在ElectricGuitar类定义中访问每个名称或构造函数
  • super()调用是必需的还是有效的?。抽象超类中没有给定构造函数

    如果不使用它,它将隐式调用super(),而不带任何参数

    如果要使用参数调用超类构造函数,则显式调用非常有用

    如果一个抽象类不能被实例化,它甚至可以有一个构造函数吗

    对。因为混凝土类的那个部分仍然需要构造

    在本例中,关于this.name是否需要关键字“this”

    不需要。有时消除编译器或人类读者的歧义会很有用

    这里覆盖的play()是什么?当抽象类中指定了一个抽象方法时,这难道不是告诉编译器该方法必须由任何子类指定吗

    注释允许编译器验证子类是否实际重写了超类中的方法。方法名或签名很容易出错,并且意外地没有重写任何方法

    当您打算重写抽象方法时,这有助于编译器将您直接指向错误

    当您打算重写一个具体的方法时,这会提供一个编译器错误,否则就不会出现。这可以大大减少我们的困惑、惊讶和脱发

    如果Instrument类、StringedInstrument类和ElectricGuitar类都指定了名为“name”的字段,并且每个字段都有指定的构造函数(如果允许),那么如何在ElectricGuitar类定义中访问每个名称或构造函数

    理想情况下,您希望在基类工具中提供一个单独的私有字段,通过基类中定义的访问器
    getName()
    进行访问

    也就是说,您可以通过强制转换访问受保护的超类字段。注意:通常这是要避免的

     ElectricGuitar guitar = new ElectricGuitar();
    
     String guitarName = guitar.name;
     String stringInstrumentName = ((StringedInstrument) guitar).name;
     String instrumentName = ((Instrument) guitar).name;
    
    super()调用是必需的还是有效的

    它不是必需的,但它是有效的。所有构造函数都必须调用一个超类构造函数,无论是显式调用还是隐式调用。如果
    super(),编译器会为您插入隐式调用

    如果一个抽象类不能被实例化,它甚至可以有一个构造函数吗

    是的,抽象类可以有构造函数。它需要被任何子类构造函数调用

    在本例中,关于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参数的构造函数
  • 只要在较小的范围内没有具有相同名称的变量,就不需要它,但为了清晰起见,建议使用它
  • 不要认为它是凌驾于
  • 之上的。您只需为抽象类提供一个实现。抽象类中的方法只是一个契约。但你必须在你的公司里实施它