Java---05---継承
継承:
継承は、クラス間の交差関係であり、あるクラスが別のクラスの特徴と機能を継承できるようにします.継承された既存のクラスを親クラス(ベースクラスまたはスーパークラス)と呼び、既存のクラスから継承された新しいクラスを子クラス(または派生クラス)と呼ぶ.1つのクラスから複数のサブクラスが派生し、クラスの階層関係が形成されます.継承は「自動所有」を意味します.すなわち、特殊クラス(オブジェクト)では、一般クラスに存在する属性や動作を再定義する必要はありません.
継承の役割:
1.明確な体現クラス間の構造階層関係
2.コードとデータの重複を減らし、可用性を向上させる.
JAVAはマルチ継承をサポートしていません.単一の継承はJAVAの継承関係を簡単にします.一つのクラスには一つの親しかいません.管理プログラムが簡単です.
同時に1つのクラスは、単一継承の欠点を克服するために、複数のインタフェースを実現することができる.
サブクラスは、親クラスのアクセス権がprivateのメンバー変数とメソッドを継承できません.
サブクラスは、親のメソッドを書き換えたり、親と同じ名前のメンバー変数を名前付けたりできます.
例:
Aクラスにはnum変数とshow()メソッドが既に存在し,サブクラスBでは同様の変数とメソッドを再定義できる.
Javaクラスの限定語:
private:クラス内でprivateに限定されたメンバーは、このクラス自体にのみアクセスできます.構築方法がprivateの場合、他のクラスはクラスをインスタンス化できません.
default:アクセス権限を追加せずに、このクラス自体と同じパッケージ内のクラスにアクセスできます.
protected:クラス内でprotectedとして定義されたメンバーは、このクラス自体、そのサブクラス、および同じパッケージ内の他のクラスによってアクセスできます.
public:クラス内でpublicに限定されたメンバーで、すべてのクラスにアクセスできます.
親のメンバーがクラスに継承されると、子のアクセス制御は親と同じになります.
子クラスは親クラスのプライベートメンバーを継承しますが、子クラスでは直接アクセスできません.
サブクラスに非プライベートな同じ名前のメンバー変数が表示された場合
サブクラスこのクラスの変数にアクセスするには、thisを使用します.
子クラス親クラスの同名変数にアクセスするにはsuper
supeの使用はthisの使用とほぼ一致し、
thisは、このクラスのオブジェクトの参照を表します.
superは親オブジェクトの参照を表します
出力結果:
AA.AA() num = 10
AA.AA() num = 20
この出力結果から,superが親オブジェクトの参照を表すことが明らかになった.
プログラムがBBクラスのオブジェクトbを生成してBBのコンストラクション関数を同時に呼び出す場合、super(num)を実行することはAAを実行するコンストラクション関数に相当する.
メソッドの書き換え:
メソッド書き換えは、メソッドの上書きまたはメソッド再定義とも呼ばれ、サブクラスで親メソッドと完全に同じ関数を定義します.関数名、パラメータ、戻り値はまったく同じです.
最初の例のshow()メソッドはメソッド書き換えです.
注意:
1.子クラスが親クラスを上書きする場合、子クラスの権限が親クラスの権限以上であることを保証しなければ上書きできません.そうしないと、コンパイルに失敗します.
2.静的は静的のみをカバーする.
3.上書きは、戻り値を含めて同じでなければなりません.
継承は、クラス間の交差関係であり、あるクラスが別のクラスの特徴と機能を継承できるようにします.継承された既存のクラスを親クラス(ベースクラスまたはスーパークラス)と呼び、既存のクラスから継承された新しいクラスを子クラス(または派生クラス)と呼ぶ.1つのクラスから複数のサブクラスが派生し、クラスの階層関係が形成されます.継承は「自動所有」を意味します.すなわち、特殊クラス(オブジェクト)では、一般クラスに存在する属性や動作を再定義する必要はありません.
継承の役割:
1.明確な体現クラス間の構造階層関係
2.コードとデータの重複を減らし、可用性を向上させる.
JAVAはマルチ継承をサポートしていません.単一の継承はJAVAの継承関係を簡単にします.一つのクラスには一つの親しかいません.管理プログラムが簡単です.
同時に1つのクラスは、単一継承の欠点を克服するために、複数のインタフェースを実現することができる.
サブクラスは、親クラスのアクセス権がprivateのメンバー変数とメソッドを継承できません.
サブクラスは、親のメソッドを書き換えたり、親と同じ名前のメンバー変数を名前付けたりできます.
例:
class A{
public int num;
public A() {
super();
// TODO Auto-generated constructor stub
}
public A(int num) {
super();
this.num = num;
}
public int show (){
System.out.println("A.show() num:"+num);
return 0;
}
}
class B extends A{
public int num;
public B() {
super();
// TODO Auto-generated constructor stub
}
public B(int num) {
super();
this.num = num;
}
public int show (){
System.out.println("B.show() num:"+num);
return 0;
}
}
class Main{
public static void main (String[] args){
A a = new A(10);
B b = new B(20);
a.show();
b.show();
}
}
Aクラスにはnum変数とshow()メソッドが既に存在し,サブクラスBでは同様の変数とメソッドを再定義できる.
Javaクラスの限定語:
private:クラス内でprivateに限定されたメンバーは、このクラス自体にのみアクセスできます.構築方法がprivateの場合、他のクラスはクラスをインスタンス化できません.
default:アクセス権限を追加せずに、このクラス自体と同じパッケージ内のクラスにアクセスできます.
protected:クラス内でprotectedとして定義されたメンバーは、このクラス自体、そのサブクラス、および同じパッケージ内の他のクラスによってアクセスできます.
public:クラス内でpublicに限定されたメンバーで、すべてのクラスにアクセスできます.
親のメンバーがクラスに継承されると、子のアクセス制御は親と同じになります.
子クラスは親クラスのプライベートメンバーを継承しますが、子クラスでは直接アクセスできません.
サブクラスに非プライベートな同じ名前のメンバー変数が表示された場合
サブクラスこのクラスの変数にアクセスするには、thisを使用します.
子クラス親クラスの同名変数にアクセスするにはsuper
supeの使用はthisの使用とほぼ一致し、
thisは、このクラスのオブジェクトの参照を表します.
superは親オブジェクトの参照を表します
class AA{
int num ;
public AA(int num) {
super();
this.num = num;
System.out.println("AA.AA() num = "+num);
}
}
class BB extends AA{
public BB(int num) {
super(num);
// TODO Auto-generated constructor stub
}
}
public class Go {
public static void main (String[] args){
AA a = new AA(10);
BB b = new BB(20);
}
}
出力結果:
AA.AA() num = 10
AA.AA() num = 20
この出力結果から,superが親オブジェクトの参照を表すことが明らかになった.
プログラムがBBクラスのオブジェクトbを生成してBBのコンストラクション関数を同時に呼び出す場合、super(num)を実行することはAAを実行するコンストラクション関数に相当する.
メソッドの書き換え:
メソッド書き換えは、メソッドの上書きまたはメソッド再定義とも呼ばれ、サブクラスで親メソッドと完全に同じ関数を定義します.関数名、パラメータ、戻り値はまったく同じです.
最初の例のshow()メソッドはメソッド書き換えです.
注意:
1.子クラスが親クラスを上書きする場合、子クラスの権限が親クラスの権限以上であることを保証しなければ上書きできません.そうしないと、コンパイルに失敗します.
2.静的は静的のみをカバーする.
3.上書きは、戻り値を含めて同じでなければなりません.
class A{
public int show (){
System.out.println("A.show() ");
return 0;
}
}
class B extends A{
public int show (){
System.out.println("B.show() ");// ,
}
}