无法理解 Java 继承
Can't understand Java inheritance
我正在学习 java 作为第一语言,所以我是一个完全的新手。
我现在正在研究 classes 之间的继承,有些地方我无法理解。我举个例子:
这是主要的class:
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();
}
}
这是子class:
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);
}
}
但是当声明超级变量时我得到这个错误:
"Cannot refer to an instance field modello while explicitly invoking a constructor"
为什么?谢谢!
您在 Bici class 中没有默认构造函数,这意味着在 Tandem class 中必须显式调用它。像这样:
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);
}
超级class 构造函数必须在子class 构造函数之前执行。这样由 superclass 定义的状态和行为可以在 subclass 构造函数执行之前正确和完整地初始化。
Java 编译器假定每个构造函数的第一行是对默认 superclass 构造函数的隐式调用,除非您显式使用 super() 或 this()。
请注意,Super 关键字用于显式调用 superclass 构造函数。如果使用这种形式,它必须作为构造函数的第一条语句出现,以确保superclass构造函数在subclass构造函数
之前执行
- Java 继承机制不包括构造函数。换句话说,superclass 的构造函数不会被 subclass 继承。 Subclasses 仍然可以使用 super() 结构调用 superclass 中的构造函数。事实上,需要一个 subclass 构造函数来调用 superclass 中的一个构造函数,作为构造函数体内的第一个动作。您可能已经看到 Java classes,其中 subclass 构造函数似乎没有调用 superclass 中的构造函数。也许 superclass 甚至没有构造函数。然而,subclass 构造函数在那种情况下仍然调用了 superclass 构造函数。你只是看不到它。让我解释一下原因:
如果 class 没有定义任何显式构造函数,Java 编译器会插入一个隐式无参数构造函数。因此,class 总是有一个构造函数。
这是因为您不能在创建实例之前调用实例方法。顺便说一句,稍后可以在构造函数中调用实例方法。
这解决了您的问题:
public Tandem (int misura, String modello, int ruote){
super(misura, modello);
this.ruote=ruote;
}
我正在学习 java 作为第一语言,所以我是一个完全的新手。 我现在正在研究 classes 之间的继承,有些地方我无法理解。我举个例子:
这是主要的class:
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();
}
}
这是子class:
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);
}
}
但是当声明超级变量时我得到这个错误: "Cannot refer to an instance field modello while explicitly invoking a constructor"
为什么?谢谢!
您在 Bici class 中没有默认构造函数,这意味着在 Tandem class 中必须显式调用它。像这样:
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); }
超级class 构造函数必须在子class 构造函数之前执行。这样由 superclass 定义的状态和行为可以在 subclass 构造函数执行之前正确和完整地初始化。
Java 编译器假定每个构造函数的第一行是对默认 superclass 构造函数的隐式调用,除非您显式使用 super() 或 this()。
请注意,Super 关键字用于显式调用 superclass 构造函数。如果使用这种形式,它必须作为构造函数的第一条语句出现,以确保superclass构造函数在subclass构造函数
之前执行- Java 继承机制不包括构造函数。换句话说,superclass 的构造函数不会被 subclass 继承。 Subclasses 仍然可以使用 super() 结构调用 superclass 中的构造函数。事实上,需要一个 subclass 构造函数来调用 superclass 中的一个构造函数,作为构造函数体内的第一个动作。您可能已经看到 Java classes,其中 subclass 构造函数似乎没有调用 superclass 中的构造函数。也许 superclass 甚至没有构造函数。然而,subclass 构造函数在那种情况下仍然调用了 superclass 构造函数。你只是看不到它。让我解释一下原因:
如果 class 没有定义任何显式构造函数,Java 编译器会插入一个隐式无参数构造函数。因此,class 总是有一个构造函数。
这是因为您不能在创建实例之前调用实例方法。顺便说一句,稍后可以在构造函数中调用实例方法。
这解决了您的问题:
public Tandem (int misura, String modello, int ruote){
super(misura, modello);
this.ruote=ruote;
}