Java継承関係において、親の方法はインスタンス変数を使用し、実例的な方法の探究を呼び出す.
オブジェクト指向プログラミングでは、ある例示的な方法がインスタンス変数を使用し、他の例示的な方法を呼び出す場合が一般的である.継承関係があると複雑になります.以下では、継承関係において、親タイプのある例示的な方法がインスタンス変数と他の例示的な方法を使用する場合について探究する.私も初心者ですので、理解が足りないところがあります.通りすがりの友達にもよろしくお願いします.
(1)親のインスタンスメソッドのインスタンス変数の使用publicまたはprotected修飾のインスタンス変数. 継承関係においては、publicとprotected修飾のインスタンス変数は、サブクラスの効果に対して同じですので、ここで統合して検討します.
このことを知ったら面白い実験ができます.次のコードはどんな内容を出力しますか?
出力結果
上記の例からも、同じ名前のメンバー変数を宣言した後に、サブクラスが自身のメンバー変数を使用していることが分かります.実際には、この時点では父親の名前のメンバー変数は、サブクラスはまだ見られていますが、サブクラスは、Super.変数を介して、名来では、親のメンバー変数を使用することができます.prvate修飾のメンバー変数. 実はこの時はもうこれ以上議論しなくてもいいです.上の結論によれば、父の方法は子類のpublic/protectedメンバー変数にアクセスしません.
以上のように、サブクラスが親タイプから継承される例示的な方法でアクセスできる変数は、親タイプのインスタンス変数であり、サブクラス自体のインスタンス変数にはアクセスできません.継承時に、サブクラスが親クラスのインスタンス変数名と同じインスタンス変数名を定義していると、サブクラスが直接親クラスにアクセスできなくなり、したがって、サブクラスの方法と親メソッドが同じ名前のインスタンス変数に対して動作が一致しないことになる.したがって、サブクラスの定義と親クラスのインスタンス変数名から同じインスタンス変数を継承することは推奨されません.
(2)親の実例的な方法の実例的な方法の呼び出し
同様に、public/protectedとprvateの2つの状況に分けて討論を行います.public/protected修飾の実例となる方法. テストの方法は簡単です.上の例を少し変えてもいいです.prvate修飾の例方法 方法がprvateの修飾がある時、多状態は存在しませんでした.コードは以下の通りです
まとめてみます
親の方法によるインスタンス変数へのアクセスは、親のインスタンス変数のみで、親のクラスを継承するサブクラスです.メモリ構造を考慮すると、サブクラスのインスタンスが占有するメモリ構造の内部に完全な親タイプのメモリ構造があると考えられる.親のインスタンスにおけるpublic/protected修飾のインスタンス変数は、サブクラスのインスタンスにとって可視であり、自身のインスタンス変数にアクセスするようにアクセスすることができ、もちろん、サブクラス自体のインスタンス変数には親クラスの可視インスタンス変数の名前がないことが前提である.一方、親の例におけるprvate修飾のインスタンス変数は、サブクラスに対して見られない.››
親の方法が例示的な方法を呼び出すと、多状態が存在する可能性がある.具体的には、親の実例的な方法で呼び出された例の布団類の書き換えが、サブクラスの引用によって前者を呼び出すと、前者が呼び出された例の方法は、掛け布団類の書き換え後のものを用いる.しかし、サブメソッドと親方法が書き換えられていない場合、このような多形効果は存在しなくなり、サブクラスで前者を呼び出す場合、前者は依然として親タイプの方法を用いる.
(1)親のインスタンスメソッドのインスタンス変数の使用
public class Test {
public static void main(String[] args) {
System.out.println(new Parent().getName());
System.out.println(new Child().getName());
}
}
class Parent {
public String name = "base";
public String getName() {
return name;
}
}
class Child extends Parent {
public String name = "child";
}
出力結果:base
base
このことから、親の方法が、親のクラスのインスタンス変数を使用すると、サブクラスで変数名と同じインスタンス変数を再定義しても、親のメソッドは、サブクラスを介して呼び出したときには、親のクラスの変数を使用しています.このことを知ったら面白い実験ができます.次のコードはどんな内容を出力しますか?
public class Test {
public static void main(String[] args) {
Child c = new Child();
c.name = "Child";
System.out.println(c.name); //(1) name
System.out.println(c.getName()); //(2) name
}
}
class Parent {
public String name = "base";
public String getName() {
return name;
}
}
class Child extends Parent {
}
(1)でコード出力されたnameは、サブクラス参照によって見つけられたnameであり、(2)コードコールされたのは親タイプからのgetName()メソッドであり、以前のテストの結果から、この方法がアクセスされたのは親タイプのnameに違いない.ここで問題なのは、サブクラスの引用で見つけたnameと親タイプのnameが同じなのかどうかということです.運行の結果は同じです.出力結果
Child
Child
ここから分かるように、子类は父类を継承した后、子类自身は一つのnameを多く出していません.その使うnameは依然として父类のnameです.つまり、メモリ構造においては、サブクラスは親クラスからのインスタンス変数を継承し、依然として親クラスのインスタンス変数であり、サブクラスにとっては可視であり、サブクラス自体のインスタンス変数として表現される.上記の例からも、同じ名前のメンバー変数を宣言した後に、サブクラスが自身のメンバー変数を使用していることが分かります.実際には、この時点では父親の名前のメンバー変数は、サブクラスはまだ見られていますが、サブクラスは、Super.変数を介して、名来では、親のメンバー変数を使用することができます.
以上のように、サブクラスが親タイプから継承される例示的な方法でアクセスできる変数は、親タイプのインスタンス変数であり、サブクラス自体のインスタンス変数にはアクセスできません.継承時に、サブクラスが親クラスのインスタンス変数名と同じインスタンス変数名を定義していると、サブクラスが直接親クラスにアクセスできなくなり、したがって、サブクラスの方法と親メソッドが同じ名前のインスタンス変数に対して動作が一致しないことになる.したがって、サブクラスの定義と親クラスのインスタンス変数名から同じインスタンス変数を継承することは推奨されません.
(2)親の実例的な方法の実例的な方法の呼び出し
同様に、public/protectedとprvateの2つの状況に分けて討論を行います.
public class Test {
public static void main(String[] args) {
new Parent().print();
new Child().print();
}
}
class Parent {
private String name = "base";
public String getName() {
return name;
}
public void print() {
System.out.println(getName());
}
}
class Child extends Parent {
private String name = "child";
public String getName() {
return name;
}
}
出力結果:base
child
明らかに、サブクラスのgetName()が親タイプのgetName()を上書きし、最終的には二つのgetName()がアクセスする変数が一致しないことになる.ここで注目すべきことは、親の例示的な方法が、他の(サブクラスで見える)例の方法を呼び出し、後者の布団類が書き換えられた場合、多状態が存在することである.さらに、print(print)方法の修飾子をprvateに変更しても、多状態は依然として存在することを検証することができる.public class Test {
public static void main(String[] args) {
new Parent().print();
new Child().print();
}
}
class Parent {
private String name = "base";
private String getName() {
return name;
}
public void print() {
System.out.println(getName());
}
}
class Child extends Parent {
private String name = "child";
private String getName() {
return name;
}
}
出力結果base
base
これも理解できます.この時は方法の書き換えがないので、多状態もありません.まとめてみます
親の方法によるインスタンス変数へのアクセスは、親のインスタンス変数のみで、親のクラスを継承するサブクラスです.メモリ構造を考慮すると、サブクラスのインスタンスが占有するメモリ構造の内部に完全な親タイプのメモリ構造があると考えられる.親のインスタンスにおけるpublic/protected修飾のインスタンス変数は、サブクラスのインスタンスにとって可視であり、自身のインスタンス変数にアクセスするようにアクセスすることができ、もちろん、サブクラス自体のインスタンス変数には親クラスの可視インスタンス変数の名前がないことが前提である.一方、親の例におけるprvate修飾のインスタンス変数は、サブクラスに対して見られない.››
親の方法が例示的な方法を呼び出すと、多状態が存在する可能性がある.具体的には、親の実例的な方法で呼び出された例の布団類の書き換えが、サブクラスの引用によって前者を呼び出すと、前者が呼び出された例の方法は、掛け布団類の書き換え後のものを用いる.しかし、サブメソッドと親方法が書き換えられていない場合、このような多形効果は存在しなくなり、サブクラスで前者を呼び出す場合、前者は依然として親タイプの方法を用いる.