Javaサブクラスコンストラクターでのsuper()の意味
私が不思議に思うのは、サブクラスがコンストラクターの最初の行にsuper()(またはsuper(arg1、arg2、...))を追加することを余儀なくされていることです。
私の元の見解では、サブクラスと親クラスは継承されますが、互いに独立しています。新しいサブクラスを作成しますが、親クラスのパラメーターを初期化する必要があるのはなぜですか?初期化されるこれらの親クラスのパラメータが属する親クラスは、具体的なオブジェクトに属しますか?親オブジェクトが存在しない場合、親パラメーターを初期化するポイントは何ですか?super()は不要ではありませんか?
もちろん答えはノーです。長い間存在してきた素晴らしいJavaには、そのような低レベルの問題はありません。
事実は…
実際、サブクラスが作成されると、それが継承する一連の親クラスが一緒に初期化されます。一般性を失うことなく、ここで父と息子のクラスを作成しました。その中で、SonクラスはFatherクラスを継承しています。
/**
* @ author: X3vvv
* @ date: 13/11/2020
*/
class Son extends Father {
// 私有变量hobby
private String hobby;
// 构造器
public Son(String name, String hobby) {
super(name);
this.hobby = hobby;
}
}
public class Father {
// 私有变量name
private String name;
// 构造器
public Father(String name) {
this.name = name; }
// 用于测试的主函数
public static void main(String[] args) {
} // 暂时为空
}
このとき、Sonをインスタンス化する場合は、Sonオブジェクトを作成します。
// 用于测试的主函数
public static void main(String[] args) {
Son monkey = new Son("WuKong");
}
次に、monkeyという名前のこのオブジェクトには、Sonクラスで定義された趣味変数だけでなく、親クラスのすべてのものも作成され、monkeyが割り当てられます。これは、トランスフォーマーのベテランが自分の体にある重い武器をオプティマスプライムに渡したようなものです。武器のカプセル化された部分(プライベート変数として)もオプティマスプライムに渡されました。
必要に応じて、monkeyは親クラスのプライベート変数名を使用することもできます。例を見てみましょう。
例:サブクラスの親クラスのプライベート変数を使用する
2つのメソッドspeak()とgetName()をFatherクラスに追加し、 * talk()*メソッドをSonクラスに追加します。
/**
* @ author: X3vvv
* @ date: 13/11/2020
*/
class Son extends Father {
// 私有变量hobby
private String hobby;
// 构造器
public Son(String name, String hobby) {
super(name);
this.hobby = hobby;
}
// speak()方法
public void speak() {
// 调用了从父类继承的函数,以使用属于父类的私有变量name
System.out.println("^&*#$*.." + this.getName() + "..$%*&");
}
}
public class Father {
// 私有变量name
private String name;
// 构造器
public Father(String name) {
this.name = name; }
// getName()方法
protected String getName() {
return name; }
// speak()方法
public void speak() {
System.out.println("You can call me father, or " + name);
}
// 用于测试的主函数
public static void main(String[] args) {
Father human = new Father("Xavier");
Son monkey = new Son("Jack", ""); // hobby只是为了方便说明,故为空值
human.speak(); // 输出结果:"You can call me father, or Xavier"
monkey.speak(); // 输出结果:"^&*#$*..Jack..$%*&"
}
}
テストを通じて、唯一の親クラスが可変の持っているもののていることが分かる名前を、そしてので、名前があるプライベート変数、サブクラスはクラス内で使用することはできません。ただし、Sonコンストラクターでsuper()を使用して、親クラスの名前を初期化します。次に、親クラスのパブリックメソッドであるgetName()を使用すると、最後にサルは親クラスのプライベート変数名を正常に使用します。
したがって、コンストラクターのsuper()のおかげで、親クラスのプライベート変数でさえサブクラスで使用できます。
意義
レベルは限られており、ここにリストされているのは2つだけであり、誰でも追加できます。
- 変数の任意の変更を防ぐために変数をカプセル化します(拡張情報:カプセル化の意味)
- 継承の利点を活用する-コードの再利用性を改善し、プログラムを簡潔かつ効率的にする
(この記事の参考書:「HeadFirstJava」)