Day 9-継承、super、this、抽象クラス
22759 ワード
第一章継承
概要
複数のクラスに同じ属性と動作がある場合、これらの内容を別のクラスに抽出すると、複数のクラスは繰り返し定義する必要がなく、このクラスを継承するだけでよい.このうち、複数のクラスを子クラス、個別のクラスを親クラス、スーパークラス、またはベースクラスと呼ぶ.
定義#テイギ#
子は親の属性と動作を継承し、子オブジェクトが親と同じ属性と同じ動作を持つようにします.サブクラスは、親の非プライベート属性とメソッドに直接アクセスできます.
メリット
継承されたフォーマット
class {
...
}
class extends {
...
}
継承後の機能–メンバー変数
メンバー変数の名前を変更しない
この時点でアクセスに影響はありません.サブクラスは、親の非プライベートメンバー変数に直接アクセスできます.
メンバー変数の重複名
アクセスは影響を受け、アクセス結果はサブクラスのメンバー変数です.
//
package cn.itcast.day09.demo01;
public class Fu {
int num = 8;
}
//
package cn.itcast.day09.demo01;
public class Zi extends Fu {
int num = 6;
public void show(){
System.out.println(" :"+super.num);//8
System.out.println(" :"+this.num);//6
}
}
package cn.itcast.day09.demo01;
public class Demo01Super {
public static void main(String[] args) {
Zi cla = new Zi();
cla.show();
}
}
小贴士:Fuクラスのメンバー変数は非プライベートで、サブクラスから直接アクセスできます.Fuクラスのメンバー変数がプライベートになった場合、サブクラスは直接アクセスできません.通常、エンコーディングでは、パッケージの原則に従ってprivateを使用してメンバー変数を修飾しますが、親クラスのプライベートメンバー変数にどのようにアクセスしますか?そうだ!共通のgetXxxメソッドとsetXxxメソッドは、親クラスで提供できます.
継承後の機能–メンバーメソッド
メンバーメソッドは名前を変更しません
子クラスの親に重複しないメンバーメソッドが表示された場合、呼び出しは影響しません.オブジェクトがメソッドを呼び出すと、まずサブクラスに対応するメソッドがあるかどうかを検索し、サブクラスに存在する場合はサブクラスのメソッドを実行し、サブクラスに存在しない場合は親クラスの対応するメソッドを実行します.
メンバーメソッドの重複名-上書き(Override)
書き換えの適用
サブクラスは、必要に応じて、自分固有の動作を定義できます.親の機能名を踏襲するとともに、子の必要に応じて親メソッドを再実装し、拡張を強化します.
package cn.itcast.day09.demo01;
public class Phone {
public void sendMessage(){
System.out.println(" ");
}
public void call(){
System.out.println(" ");
}
public void showNum(){
System.out.println(" ");
}
}
package cn.itcast.day09.demo01;
public class NewPhone extends Phone {
public void sendMessage(){
super.sendMessage();
System.out.println(" ;");
}
@Override
public void call() {
super.call();
System.out.println(" ");
}
@Override
public void showNum() {
super.showNum();
System.out.println(" ");
}
}
package cn.itcast.day09.demo01;
public class Demo02MethodExtend {
public static void main(String[] args) {
Phone one = new Phone();
one.call();
one.sendMessage();
one.showNum();
System.out.println("-------------");
NewPhone two = new NewPhone();
two.call();
two.sendMessage();
two.showNum();
}
}
注意事項
継承後の機能–構築方法
super()
が親クラスの構築関数を呼び出してから、サブクラス構築関数のメソッドボディを実行する.superとthis
サブクラスオブジェクトを作成するたびに、親空間を初期化してから、サブクラスオブジェクト自体を作成します.目的は、サブクラスオブジェクトに対応する親空間が含まれている場合、その親のメンバーを含めることができます.親メンバーがprivate修飾されていない場合、サブクラスは親メンバーを自由に使用できます.コードは,サブクラスの構造メソッド呼び出しに現れる場合,必ず親クラスの構造メソッドを呼び出す.
package cn.itcast.day09.demo01;
public class Animal {
public Animal() {
System.out.println("Animal()");
}
public void eat() {
System.out.println("Animal:eat()");
}
}
package cn.itcast.day09.demo01;
public class Cat extends Animal {
public Cat() {
System.out.println("Cat()");
}
public void eat() {
System.out.println("Cat():eat");
}
public void methodSuperThis() {
super.eat();
this.eat();
}
}
package cn.itcast.day09.demo01;
public class Demo03SuperThis {
public static void main(String[] args) {
Cat one = new Cat();
//Animal()
//Cat()
one.eat();//Cat:eat()
one.methodSuperThis();
//Animal:eat()
//Cat:eat()
}
}
継承の特徴
最上位の親クラスの場合Objectクラス.すべてのクラスは親としてObjectをデフォルトで継承します.
第二章抽象類
抽象メソッド:メソッド体のメソッドがありません.コード例:
public abstract void run();
抽象クラス:抽象メソッドを含むクラス.クラスに抽象メソッドが含まれている場合は、クラスを抽象クラスとして定義する必要があります.abstract class {
public abstract void run();
}
抽象的な使用
抽象クラスを継承する子**は、**親のすべての抽象メソッドを書き換える(実装する)**必要があります.そうでなければ、サブクラスも抽象クラスとして宣言する必要があります.
注意事項
理解:抽象クラスのオブジェクトを作成し、抽象的なメソッドを呼び出すと仮定しますが、抽象的なメソッドには具体的なメソッド体がなく、意味がありません.
理解:サブクラスの構築方法には、デフォルトのsuper()があり、親クラスの構築方法にアクセスする必要があります.
理解:抽象メソッドが含まれていない抽象クラスは、呼び出し元にクラスオブジェクトを作成させたくないため、通常、特定のクラス構造設計に使用されます.
理解:すべての抽象メソッドを書き換えないと仮定すると、クラスに抽象メソッドが含まれる可能性があります.では、オブジェクトを作成した後、抽象的なメソッドを呼び出すのは意味がありません.
第三章継承の総合事例
グループの主人は普通のお年玉を出す.あるグループには複数のメンバーがいて、グループの主はメンバーに普通のお年玉を送った.普通のお年玉のルール:
説明に従って、ケース内のすべてのクラスの定義と指定したクラス間の継承関係を完了し、お年玉を出す操作を完了してください.
ケース拡張: