【问题标题】:Can't understand Java inheritance看不懂Java继承
【发布时间】:2017-03-02 17:11:03
【问题描述】:

我正在学习 Java 作为第一语言,所以我是一个完整的新手。 我现在正在研究类之间的继承,有些东西我无法理解。我举个例子:

这是主类:

public class Bici {

protected int misura;
protected String modello;

public Bici(int misura, String modello)
{
this.misura=misura;
this.modello=modello;
}

public void stampaCaratteristiche()
{
System.out.println("Size is: "+misura);
System.out.println("Model is: "+modello);
System.out.println();
}
}

这是子类:

public class Tandem extends Bici {

private int ruote;

public Tandem (int ruote)
{
super(misura, modello);
this.ruote=ruote;
}

public void stampaCaratteristicheTandem()
{
System.out.println("Le ruote del tandem sono "+ruote);
}

}

但是在声明超级变量时,我得到了这个错误: “在显式调用构造函数时无法引用实例字段 modello”

为什么?谢谢!

【问题讨论】:

  • 那么,您希望misuramodello 具有什么值?它们是超类声明的变量,还没有被任何东西初始化。通常你会将这些作为额外的构造函数参数。

标签: java inheritance superclass super


【解决方案1】:
  1. Bici 类中没有默认构造函数,这意味着在 Tandem 类中必须显式调用它。像这样:

    private int ruote;
    
    public Tandem (int ruote, int misura, String modello)
    {
    super(misura, modello);
    this.ruote=ruote;
    

    }

     public void stampaCaratteristicheTandem()
     {
     System.out.println("Le ruote del tandem sono "+ruote);
     }
    
  2. 超类构造函数必须在子类构造函数之前执行。这样超类定义的状态和行为就可以在子类构造函数执行之前正确且完整地初始化。

Java 编译器假定每个构造函数的第一行都是对默认超类构造函数的隐式调用,除非您显式使用 super() 或 this()。

请注意,Super 关键字用于显式调用超类构造函数。如果使用这种形式,必须作为构造函数的第一条语句出现,以保证超类构造函数在子类构造函数之前执行

  1. Java 继承机制不包括构造函数。换句话说,超类的构造函数不会被子类继承。子类仍然可以使用 super() 结构调用超类中的构造函数。事实上,子类构造函数需要调用超类中的一个构造函数作为构造函数体内的第一个操作。您可能已经看到 Java 类,其中子类构造函数似乎没有调用超类中的构造函数。也许超类甚至没有构造函数。但是,在这种情况下,子类构造函数仍然调用超类构造函数。你只是看不到它。让我解释一下原因:

如果一个类没有定义任何显式构造函数,Java 编译器会插入一个隐式无参数构造函数。因此,一个类总是有一个构造函数。

【讨论】:

    【解决方案2】:

    这是因为您不能在创建实例之前调用实例方法。顺便说一句,稍后可以在构造函数中调用实例方法。

    这解决了你的问题:

    public Tandem (int misura, String modello, int ruote){
         super(misura, modello);
         this.ruote=ruote;
    }
    

    【讨论】:

    • misuramodello 是实例变量,而不是实例方法。
    猜你喜欢
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多