javaの継承とポリモーフィズム
相続
継承:
1.継承は、オブジェクト指向プログラミングの3つの主要な機能の1つであり、既存のクラスに基づいて新しいクラスを作成するためのメカニズムです。継承から派生したクラスが呼び出されますサブクラス(または派生クラス)、継承されたクラスが呼び出されます親クラス(またはスーパークラス)。
2. Javaでは、クラスごとに1つの親クラスのみが許可されます。構文は次のとおりです。
クラス<子クラス>は<親クラス>を拡張します
3。オブジェクトクラスすべてのクラスの直接の親または間接の親です。
注:1.最終的に変更されたクラスにサブクラスを含めることはできません。
2.親クラスのメソッドまたは属性をプライベートに変更すると、サブクラスはメソッドまたは属性を継承できなくなります。
3. Javaの既存のクラス(Void、String、Class、Scanner、System、パッケージクラス(Short、Integer、Long、Float、Double、Byte、Character)に対応する8つの基本データ型)が最終的に変更されました、だからこれらのクラス継承できない。
継承の役割:サブクラスは親クラスの特定のメンバー変数とメソッドを継承できるため、コードの再利用が改善され、サブクラスは新しいメンバー変数とメソッドを追加することもできます
thisキーワード:このクラスのコンストラクターの呼び出しに使用(this()はパラメーターなしのコンストラクターの呼び出し、this(パラメーター)はパラメーター化されたコンストラクターの呼び出し)
superキーワード:親クラスのコンストラクターの呼び出しに使用(super() ;パラメーターなしの構築メソッドを呼び出す、super(パラメーター);パラメーター化された構築メソッドを呼び出す)
子クラスの作成メソッドに対する
親クラスの影響:親クラス:
package Test;
public class Person {
public Person() {
System.out.println("父类无参构造方法");
}
public Person(int age) {
System.out.println("父类有参构造方法");
}
}
サブクラス:
package Test;
public class Student extends Person{
public Student() {
super();//可省
//无this存在时,此处默认有个super()来调用父类无参构造方法
System.out.println("子类无参构造方法");
}
public Student(String name) {
this();
//有this存在时,则默认的super()消失,此处this()调用上面的无参构造方法
System.out.println("子类有参构造方法");
}
public static void main(String[] args) {
new Student();//调用Student类中的无参构造方法
Student stu = new Student("a");//调用Student类中的有参构造方法
}
}
結果:
父类无参构造方法
子类无参构造方法
父类无参构造方法
子类无参构造方法
子类有参构造方法
つまり、サブクラスのパラメーターなしコンストラクターは、親クラスのコンストラクター(パラメーターありまたはパラメーターなし)を呼び出す必要があり、サブクラスのパラメーターなしコンストラクターは、これなしで親クラスコンストラクターを呼び出す必要があります。
親クラスメンバー変数は上書きされます
。1。サブクラスメンバー変数と親クラスメンバー変数が同じ名前の場合、サブクラスオブジェクトの場合、親クラスメンバー変数はサブクラスに継承されません(つまり、サブクラスメンバー変数は親クラスメンバーをカバーします)変数)、現時点では、サブクラスのメンバー変数は親クラスのメンバー変数を非表示にします。
2.あなたが実装されてもよい非改変静的ブロックまたは方法(超超キーワードのサブクラスに隠された親クラスのメンバ変数を使用している場合。属性名)。
書き直す
リライトの重要なポイント継承された知識である
書き換え:より正確サブクラスオブジェクトディクテーション機能を説明するために、あなたがいることを継承されたメソッド書き換える必要があることを修正するので、この方法は、より正確であることを、親クラスから継承されたメソッドをサブクラスの特性を説明してください。
変更されたメソッドの前に@Overrideアノテーションを追加できます。また、そのようなアノテーションは、このメソッドが変更されたかどうかを通知することもできます。(このコメントを持つ非オーバーライドメソッドはエラーを報告します)
静的に変更されていないコードブロックまたはサブクラスのメソッドで親クラスのオーバーライドされたメソッドを呼び出す場合は、superキーワードを使用してそれを実現できます。
書き換えは次の条件を満たす必要があります
。1.サブクラスの書き換えメソッドと親クラスがオーバーライドされているメソッドのメソッドは、メソッド名とパラメーターリストで同じです
。2。親クラスのメソッドが上書きされ、戻り値の型がない場合、または戻り値の型が基本データ型の場合、サブクラスのオーバーライドを必要とするメソッドの戻り値の型と親クラスが繰り返されます。 writeメソッドの戻り値の型は同じです
。3。親クラスのオーバーライドされたメソッドの戻り値の型が参照データ型の場合、サブクラスの書き換えが必要なメソッドの戻り値の型は、親クラスのオーバーライドされたメソッドの戻り値の型と同じです。またはそのサブクラス。
StringはObjectのサブクラスであり、書き換えられます。
4.サブクラス書き換えメソッドは、親クラス書き換えメソッドのアクセス許可を絞り込むことができません。サブクラス書き換えメソッドアクセス許可は、親クラス書き換えメソッドのアクセス許可以上である必要があります。
サブクラス書き換えメソッドアクセス許可は、親クラスのオーバーライドされたメソッドのアクセス許可はエラー
5 として報告されます。親クラスの静的メソッドはサブクラスによって継承できますが、サブクラスによってオーバーライドできません
。親クラスの非静的メソッドの場合、サブクラスがオーバーライドされている場合、静的を追加できません。
静的な変更のため、書き換えることはできません。
親クラス構築法がサブクラス構築法に及ぼす影響
1.クラスでコンストラクターが定義されていない場合、デフォルトでパラメーターのないコンストラクターがあり、その構造は次のとおりです:
public class name(){
super(); //親クラスを呼び出すには、有効なコードの最初の行に配置する必要がありますパラメーターコンストラクターなし
}
2、これ([パラメーターリスト])はこのクラスコンストラクターを呼び出しますが、有効なコードの最初の行に配置する必要があるため、コンストラクターがこのクラスコンストラクターを呼び出している場合、親クラスコンストラクターを呼び出すことはできません。メソッド。
3.サブクラスコンストラクターがこのクラスコンストラクターを呼び出さない場合、または親クラスコンストラクターを呼び出すように指定しない場合、デフォルトで親クラスのパラメーターなしコンストラクターが呼び出されます。
package 父类构造方法对子类构造方法的影响;
public class Father {
public Father() {
super();//调用Object类构造方法
System.out.println("父类构造方法");
}
}
package 父类构造方法对子类构造方法的影响;
public class Son extends Father{
public Son() {
super();
System.out.println("子类构造方法");
}
}
結果:親クラスのコンストラクターがサブクラスを通じて呼び出されます
父类构造方法
子类构造方法
4.要約:
a。親クラスにパラメーターなしの構築メソッド(明示的または暗黙的)があり、サブクラスの構築メソッドが呼び出される親クラスの構築メソッドを明示的に指定していない場合、サブクラスはこれを呼び出さないサブクラスの他のコンストラクターのコンストラクターはすべて、super()を使用して、
親クラスのパラメーターなしのコンストラクターを暗黙的に呼び出します。b。親クラスにパラメーターなしのコンストラクターがない場合(明示的または暗黙的)、サブクラスコンストラクターが必要です。親クラスまたはこのクラスの呼び出しメソッドを直接または間接的に指定する必要があります
キーワードの最終要約
1.変更された変数は定数です;
2.変更されたメソッドは書き換えられません;
3.変更されたクラスにはサブクラスがありません(String、8つの基本データ型に対応するパッケージ化クラス:バイト-バイト、ショート-ショート、整数-整数、キャラクター...)
キーワードの夕食の概要
1. superキーワードは、親クラスのメンバー変数(super。属性)およびメソッド(super。親クラスメソッド([パラメーターリスト]))を呼び出すことができます。
2. superキーワードをサブクラスコンストラクターで使用して、スーパークラスコンストラクターを呼び出すことができます:super([parameter list]);
3. superは、静的メソッドまたは静的コードブロックでは使用できません。
ポリモーフィズム
ポリモーフィズムとは、メソッドが複数の状態で存在し、
その原理は自動型データ変換に似ています。
int a=12;
long b=a;//int类型自动转换为long
ポリモーフィズム:最初にサブクラスのオブジェクトを作成し、次にサブクラスによって作成されたオブジェクトを親クラスの変数(アドレスの受け渡し)に割り当てます。サブクラスは親クラスのメソッドを書き換え、その結果、コンパイル時間呼び出されたメソッドは親メソッドですが、運用フェーズこの変数はサブクラスによって作成されたオブジェクトを指すため、最後の呼び出しはサブクラスのメソッドです。1つの方法には複数の状態、つまり多態性があります。
注:1.親クラスのメソッドが子クラスで書き換えられない場合、このメソッドを呼び出すときにポリモーフィズムはありません。
2.ポリモーフィズムはメソッドにのみ反映され、属性には反映されません。たとえば
、両方のmoveメソッドはサブクラスですが、name属性は異なります。サブクラスオブジェクトの名前はサブクラスのものであり、親クラスオブジェクトの名前はスーパークラスのものです。
親クラス:
package com.zzu;
public class Mammal {
public void move() {
System.out.println("正在游动。。。");
}
}
サブクラス:
package com.zzu;
public class Whale extends Mammal{
double weight=1;
public void move() {
System.out.println("靠鳍游动。。。");
}
public void eat() {
System.out.println("正在吃东西......");
}
}
実行:
package com.zzu;
public class Ocean {
public static void main(String[] args) {
Whale whale = new Whale();
whale.move();//直接调用子类方法
//多态
Mammal mammal = whale; //上转型
//等价于Mammal mammal = new Whale();
mammal.move(); //表面上是父类方法,实际上是子类的方法
//System.out.println(mammal.weight);
//mammal.eat(); //上转型对象是不能调用子类中新增方法和属性的!这两种均为错误!
//证明传递的是地址:
System.out.println(mammal);
System.out.println(whale);//最终结果二者相同,说明二者的地址是相同的
//int c = (int)b; //强制数据类型转换
Whale mammal2 = (Whale)mammal; //下转型,将大类型强制转换为小类型,并将其赋值给小类型。
mammal2.eat();
System.out.println(mammal2.weight);//此时就可以用子类新增的属性和方法
//Whale whale2 = (Whale)new Mammal();此为写法会报错
//只有上转型过的对象才可以进行下转型!!!
}
}
実行結果は次のとおりです。
靠鳍游动。。。
靠鳍游动。。。
com.zzu.Whale@52e922
com.zzu.Whale@52e922
正在吃东西......
1.0
多态特点:
1、编译时和运行时类型不一致
2、编译时调用的方法一定被子类所重写
3、父类类型的变量 = 子类类型的对象(上转型对象)
上部遷移オブジェクト
サブクラスは、変数宣言に割り当てられたインスタンス化親クラスオブジェクト、オブジェクトは、変換上のオブジェクト、オブジェクトに変換として知られているプロセスと呼ばれ、自動型変換のデータ型の変換に対応する:
哺乳動物クジラに哺乳動物の型にキャストタイプ
に関する注意:
1.新しく変換されたオブジェクトは、サブクラスの新しく追加されたメンバー変数を操作できません。サブクラスの新しく追加されたメソッドを呼び出すことはできません。
新しく変換されたオブジェクトがサブクラスの新しく追加されたプロパティまたはメソッドを呼び出すと、エラーが発生します
。2。アップキャストオブジェクトが親クラスのメソッドを呼び出しますメソッドがサブクラスによってオーバーライドされている場合は、上書き後のサブクラスの動作特性が表示されます。それ以外の場合は、親クラスの動作特性が表示されます。
3.上位変換オブジェクトを使用して、親クラスのグローバル変数を呼び出します。グローバル変数がサブクラスによって上書きされているかどうかに関係なく、親クラスのグローバル変数が使用されます。
変革中
1.上部変換オブジェクトは、オブジェクトを作成したサブクラスタイプのオブジェクトに強制的に変換できます。つまり、上部変換オブジェクトは、下部変換オブジェクトと呼ばれるサブクラスオブジェクトに復元されます。(強制変換により実装)
2.復元されたオブジェクトは、サブクラスのすべてのプロパティと機能を備えています。つまり、サブクラスで継承または追加されたメンバー変数を操作し、サブクラスで継承または新規のメソッドを呼び出すことができます。
注:親クラスによって作成されたオブジェクトを、強制によって子クラスによって宣言された変数に割り当てることはできません。(つまり、変換後のオブジェクトのみを変換できます)
要約:
1.ポリモーフィズムは継承する必要があります。
ポリモーフィズムは書き換える必要があります。
ポリモーフィックなコンパイル時のタイプとランタイムタイプは異なる必要があります。
(ポリモーフィズムはメソッドにのみ反映され
ます)2.サブクラスによって作成されたオブジェクトは、上位変換オブジェクトと呼ばれる親タイプの変数に割り当てられます
3. 上位変換オブジェクトは、新しく追加されたサブクラスを呼び出すことができません(サブクラスは親クラスとは異なります) )メソッドとプロパティ。
4.親クラスによって作成されたオブジェクトは、強制変換後にサブクラス型の変数に割り当てられます。これは下位変換オブジェクトと呼ばれます(ただし、このオブジェクトが上位変換を受けている場合のみ、下位変換を実行できます)。