JAvaメソッドとプロパティの継承における誤り
2951 ワード
JAvaメソッドとプロパティの継承における誤り
プライベート属性とメソッドを継承できますか?次の実行結果を見てください.
最初は「privateは継承できる」という結論が得られると思っていましたが、その後、いろいろな証明を求めて私が間違っていることを証明し、反射で一気にクラスの内容を証明することができます.
Life lf=new Person();メソッドでは、サブクラスが書き換えられた場合はサブクラスメソッドを呼び出し、メソッドが書き換えられていない場合は、サブクラスでメソッドが見つからない場合は親クラスに行き、親クラスが見つからない場合は、親クラスの親クラスに行きます.アトリビュートの場合、現在のオブジェクトに対応するオブジェクトが見つからない場合は、そのオブジェクトの親クラスを検索します.長い間、サブクラスは親のprivate属性を継承できませんが、継承方法(例えばpublicメソッド)で親のprivate属性にアクセスできます.メソッドと属性の呼び出し順序によって、thisやsuperを書かない場合、デフォルトはthisです.次のコードを見てください.
これは多態に関する問題であり,すべての物事が多態的に発生できるわけではなく,通常の方法呼び出しだけが多態的であることができる.たとえば、ドメインに直接アクセスすると、このアクセスはコンパイル期間中に解析されます.したがって、子クラスが親クラスにアップコンバートされると、親に定義されていないメソッドが失われ、privateのプロパティに加えて、他のプロパティが親クラスのプロパティに上書きされます.PersonオブジェクトがLifeリファレンスに変換されると、ドメインアクセス操作はコンパイラによって解析されます.これはマルチステートではありません.さらに静的メソッドは、単一のオブジェクトではなくクラスに関連付けられます.次のコード
次のコードを見てみましょう
Barには2つのaがあり、1つは親が継承したもので、1つは自分のもので、foo.aは親の中で隠されていますが、foo.addFive()にはBarに加算されているので出力は:3
もし私たちがBarのaddFive()を注釈したら?結果は:3 8 public int a=10にコメントしたら、実行結果は何ですか?結果:3 9
プライベート属性とメソッドを継承できますか?次の実行結果を見てください.
class Life{
private String name;
public String getName(){
return this.name;
}
public void setName(String name){
this.name=name;
}
}
public class Person extends Life{
private int age;
public int getAge(){
return this.age;
}
public static void main(String args[]){
Life lf=new Person();
lf.setName("father");
System.out.println(lf.getName());// father
}
}
最初は「privateは継承できる」という結論が得られると思っていましたが、その後、いろいろな証明を求めて私が間違っていることを証明し、反射で一気にクラスの内容を証明することができます.
void che() {
Method[] m = this.getClass().getDeclaredMethods();
Field[] f = this.getClass().getDeclaredFields();
for (Method d : m)
System.out.println(d.getName());
for (Field d : f)
System.out.println(d.getName());
}
Life lf=new Person();メソッドでは、サブクラスが書き換えられた場合はサブクラスメソッドを呼び出し、メソッドが書き換えられていない場合は、サブクラスでメソッドが見つからない場合は親クラスに行き、親クラスが見つからない場合は、親クラスの親クラスに行きます.アトリビュートの場合、現在のオブジェクトに対応するオブジェクトが見つからない場合は、そのオブジェクトの親クラスを検索します.長い間、サブクラスは親のprivate属性を継承できませんが、継承方法(例えばpublicメソッド)で親のprivate属性にアクセスできます.メソッドと属性の呼び出し順序によって、thisやsuperを書かない場合、デフォルトはthisです.次のコードを見てください.
class Life {
String name="father";
public String getName() {
return this.name;
}
}
public class Person extends Life {
String name="son";
public static void main(String args[]) {
Life lf=new Person();
System.out.println(lf.name);// **father
}
}
これは多態に関する問題であり,すべての物事が多態的に発生できるわけではなく,通常の方法呼び出しだけが多態的であることができる.たとえば、ドメインに直接アクセスすると、このアクセスはコンパイル期間中に解析されます.したがって、子クラスが親クラスにアップコンバートされると、親に定義されていないメソッドが失われ、privateのプロパティに加えて、他のプロパティが親クラスのプロパティに上書きされます.PersonオブジェクトがLifeリファレンスに変換されると、ドメインアクセス操作はコンパイラによって解析されます.これはマルチステートではありません.さらに静的メソッドは、単一のオブジェクトではなくクラスに関連付けられます.次のコード
class Life {
public static String getName() {
return "father";
}
}
public class Person extends Life {
public static String getName(){
return "son";
}
public static void main(String args[]) {
Life lf=new Person();
System.out.println(lf.getName());// **father
}
}
次のコードを見てみましょう
class Foo {
int a=3;
public void addFive() {
a += 5;
}
}
public class Bar extends Foo {
int a=10;
public void addFive() {
a += 6;
}
public static void main(String[] args) {
Foo foo = new Bar();
System.out.println(foo.a);//***** 3
foo.addFive();
System.out.println(foo.a);//**** 3
}
}
Barには2つのaがあり、1つは親が継承したもので、1つは自分のもので、foo.aは親の中で隠されていますが、foo.addFive()にはBarに加算されているので出力は:3
もし私たちがBarのaddFive()を注釈したら?結果は:3 8 public int a=10にコメントしたら、実行結果は何ですか?結果:3 9