(10)Java学習ノート——対象04——継承

9387 ワード

継承
継承されたメリット:
1/コードの多重化の向上
2/コードの保守性の向上
3/クラスとクラスの間に関連を生じさせ,3番目の特徴的多様性に前提を提供した.(継承の1つの弊害でもある:クラスの結合性の強化)
開発の原則:低結合、高集約
結合けつごう:クラスとクラスの関係クラスとクラスの関係
集約:自分で何かを完成させる能力
継承された基本フォーマット(extendsキーワード)
classサブクラス名extends親クラス名{}
例1:
class Fu()
{
}

class Zi extends Fu	//     extends       
{
}

例2:
class ExtendsDemo 
{
	public static void main(String[] args) 
	{
		Student s = new Student();
		s.name="zhangsan";
		s.age=20;
		s.study();
	}
}

class Person
{
	String name;
	int age;
}

class Student extends Person	//  extends       
{
	void study()
	{
		System.out.println(name+"....student study...."+age);
	}
}

class worker extends Person		//  extends       
{
	void work()
	{
		System.out.println(name+"....worker work...."+age);
	}
}

JAVAで継承された特徴:
1/Javaでは単一継承がサポートされており,多重継承は直接サポートされていないが,C++での多重継承を改良している.複数の親クラスに同じメンバーがいるため、マルチ継承は直接サポートされません.呼び出しの不確実性が発生します.
単一継承:サブクラスには直接親が1つしかありません.
2/Javaは多層(多重)継承をサポートします.(CはBを継承し,BはAを継承する)すると,継承体系が現れる.
継承の注意事項:
1/子クラスは、親クラスのすべての非プライベートメンバー(メンバー変数とメンバーメソッドを含む)のみを統合できます.
2/子クラスは親の構築方法を継承できませんが、superで親の構築方法にアクセスできます.
3/一部の機能を継承しない
4/ 
継承システムを使用する場合:
1/システムの最上位クラスを表示し、システムの基本機能を理解します.
2/システム内の最サブクラスオブジェクトを作成し、機能の使用を完了します.
継承はいつ定義されますか?
クラスとクラスの間に所属関係がある場合は、継承を定義します.XXXはYYYの一種であり、XXX extends YYY
————————————————————————————————————————————————————————————
継承中のメンバー(メンバー変数、構築メソッド、メンバーメソッド)の関係
継承者メンバー変数の関係:
a/サブクラスのメンバー変数と親クラスのメンバー変数の名前が一致しません.
b/子クラスのメンバー変数は、親クラスのメンバー変数名と同様に、近接原則(近接原則の前後順序:先の子クラスローカル->子クラスメンバー->親クラスメンバー)が採用されます.
メンバー変数を呼び出す例:
class Father	//  
{
	int num = 10;
}

class Son extends Father	//      
{
	int num = 20;

	public void show()
	{
		int num = 30; 
		System.out.println(num);	//        。
	}
}

class ExtendsDemo 
{
	public static void main(String[] args) 
	{
		Son s = new Son();
		s.show();
	}
}

/*
   30
*/

thisとsuperの違いと応用
違い:
thisは、このクラスに対応する参照を表します.
superは親ストレージスペースの識別を表します(親参照と理解でき、親メンバーを操作できます).
呼び出し方法:
a/呼び出しメンバー変数:
this . メンバー変数(このクラスを呼び出すメンバー変数を表す)
super . メンバー変数(親を呼び出すメンバー変数を表す)
呼び出しメンバー変数の例:
class Father	//  
{
	int num = 10;
}

class Son extends Father	//      
{
	int num = 20;

	public void show()
	{
		int num = 30; 
		System.out.println(num);	//        。
		System.out.println(this.num);	//this          (int num = 20;
		System.out.println(super.num);	//super             (         ,         )
	}
}

class ExtendsDemo 
{
	public static void main(String[] args) 
	{
		Son s = new Son();
		s.show();
	}
}

/*
   30,20,10
*/

b/構成方法の呼び出し
this (...) (本クラスを呼び出す構築方法を示す)
super(....) (親を呼び出す構築方法を示します)
継承の構築方法の関係:
1/子クラス内のすべてのコンストラクションメソッドは、親クラスの中空パラメータのコンストラクションメソッドにデフォルトでアクセスします.
2/サブクラスを初期化する前に、必ず親データの初期化を完了してください.親のデータを継承できます.
3/サブクラスの各構築メソッドの最初の文のデフォルトは、super()です.
構築メソッドを呼び出す例:
class Father
{
	public Father()	//Father      
	{
		System.out.println("Father       ");
	}

	public Father(String name)	//Father      
	{
		System.out.println("Father       ");
	}
}

class Son extends Father
{
	public Son()	//son       
	{
		System.out.println("son       ");
	}

	public Son(String name)	//son       
	{
		System.out.println("son       ");
	}
}


class ExtendsDemo2 
{
	public static void main(String[] args) 
	{
		Son s = new Son();
		System.out.println("------------------------");
		Son s1 = new Son("  ");
		
	}
}

/*
  
Father       
son       
-------------------------
Father       	//                  
son       
*/

c/呼び出しメンバーメソッド
this . メンバーメソッド(このクラスを呼び出すメンバーメソッドを示す)
super . メンバーメソッド(親を呼び出すメンバーメソッドを示す)
継承中のメンバーメソッドの関係:
a/子クラスのメソッドと親クラスのメソッド宣言は異なります.
b/子クラスのメソッドは、親クラスのメソッド宣言と同じです.
サブクラスオブジェクトからメソッドを呼び出す順序:
-----1/このメソッドがあるかどうか、サブクラスを探して呼び出します
---2/このメソッドが親にあるかどうかを見て、ある場合は呼び出し、ない場合はエラーを報告します.
——————————————————————————————————————————————————————
メソッドの書き換え:
子の親のメンバーメソッドの特徴:
子の親クラスにメンバーメソッド宣言が同じ場合(メソッド名、パラメータリストが同じ)に、子クラスのメソッドが実行されます.
この現象をメソッド書き換えと呼ぶ.これは、文字クラスでのメソッドの特性です.
メソッドの2つの特性(メソッドのみ)
1/重荷.同じクラスにあります.(同じクラスに表示されるメソッド名と同様に、パラメータリストが異なるメソッドであり、戻り値には関係ありません.)
2/書き換える.サブクラスにあります.上書きは書き換え、上書きとも呼ばれます.override(子の親クラスでメンバーメソッドが同じことを宣言する場合(メソッド名、パラメータリスト)
メソッド書き換えの注意事項:
1/子メソッド親メソッドを上書きするには、子権限が親権限以上である必要があります.
2/静的関数は静的関数のみを上書きするか、静的関数で上書きすることができます.
オーバーライド操作はいつ使用しますか?(メソッド書き換えの適用)
1つのクラスを子クラスに拡張する場合は、子クラスは親クラスの機能宣言を保持する必要があります.
ただし、サブクラス内のこの機能に固有の内容を定義する場合は、オーバーライド操作を使用して完了します.
例:
class ExtendsTest01 
{
	public static void main(String[] args) 
	{
		NewPhone p = new NewPhone();
		p.call();
		p.show();
	}
}

class Phone
{
	void call()
	{
	}
	void show()
	{
		System.out.println("number");
	}
}

class NewPhone extends Phone	//           
{
	void show()
	{
	System.out.println("name");
	System.out.println("pic");
	super.show();	//      show  
	}
}

メソッド書き換えの注意事項:
a/親クラスのプライベートメソッドは書き換えられません.
b/サブクラスが親を書き換える方法は、アクセス権限をより低くすることはできません.
c/親クラスの静的メソッドであり、子クラスも静的メソッドで書き直さなければならない.
練習01:
継承前の学生と先生のケースを使用します.
/*
       

  :
  :
    :  ,  
    :  ,  
    :getXxx() / setXxx()

  
    :  ,  
    :  ,  
    :getXxx() / setXxx()

*/

//     
class Student
{
	String name;
	int age;

	public Student()	//      
	{
	}

	public Student(String name ,int age)	//      
	{
		this.name = name;
		this.age = age;
	}

	public void setName(String name)
	{
		this.name = name;
	}

	public String getName()
	{
		return name;
	}

	public void setAge(int age)
	{
		this.age = age;
	}

	public int getAge()
	{
		return age;
	}
}

//       
class Teacher	
{
	String name;
	int age;

	public Teacher()
	{
	}

	public Teacher(String name ,int age)
	{
		this.name = name;
		this.age = age;
	}

	public void setName(String name)
	{
		this.name = name;
	}

	public String getName()
	{
		return name;
	}

	public void setAge(int age)
	{
		this.age = age;
	}

	public int getAge()
	{
		return age;
	}
}


class  ExtendsTest_01
{
	public static void main(String[] args) 
	{
		Student s1 = new Student();	//         
		s1.setName("  ");
		s1.setAge(26);
		System.out.println(s1.getName()+"----"+s1.getAge());

		System.out.println("-------------------------------");

		Student s2 = new Student("  ",27);	//           
		System.out.println(s2.getName()+"----"+s2.getAge());


	}
}

継承された学生と先生のケースを使用します.
/*
                person ,     person 

    :  ,  
    :  
    :getXxx()  /  setXxx()

*/

//    person  
class Person
{
	private String name;
	private int age;

	public Person()
	{
	}

	public void setName(String name)
	{
		this.name = name;
	}

	public String getName()
	{
		return name;
	}

	public void setAge(int age)
	{
		this.age = age;
	}

	public int getAge()
	{
		return age;
	}
}

//    Student    person  
class Student extends Person
{
}

//    Teacher    Person  
class Teacher extends Person
{
}

class ExtendsTest_02 
{
	public static void main(String[] args) 
	{
		Student s = new Student();
		s.setName("   ");
		s.setAge(27);

		System.out.println(s.getName()+"----"+s.getAge());

		System.out.println("----------------------------");

		Teacher t = new Teacher();
		t.setName("    ");
		t.setAge(26);

		System.out.println(t.getName()+"----"+t.getAge());

	
	}
}

練習02:
猫と犬のケース
/*
    

       playGame
       lookHome

  :
         ,  ,            

    : , 
    :  
    :getXxx()  / setXxx()

     :

       playGame
       lookHome

*/

//      ,       
class Animal
{
	private String eat;
	private String sleep;

	public Animal(String eat, String sleep)	//           
	{
		this.eat = eat;
		this.sleep = sleep;
	}

	public void setEat(String eat)
	{
		this.eat = eat;
	}

	public String getEat()
	{
		return eat;
	}

	public void setSleep(String sleep)
	{
		this.sleep = sleep;
	}

	public String getSleep()
	{
		return sleep;
	}
	
}

//       ,  animal
class Cat extends Animal
{
	public Cat(String eat,String sleep)	//           
	{
		super(eat,sleep);	//  super           
	}

	public void playGame()	//      ,         
	{
		System.out.println("    ");
	}
}

//        ,  animal
class Dog extends Animal
{
	public Dog(String eat,String sleep)
	{
		super(eat,sleep);
	}

	public void lookHome()
	{
		System.out.println("    ");
	}
}

class ExtendsTest_03 
{
	public static void main(String[] args) 
	{
		Cat c = new Cat("  ","  ");
		System.out.println(c.getEat()+"----"+c.getSleep());
		c.playGame();

		System.out.println("----------------------------");

		Dog d = new Dog("  ","   ");
		System.out.println(d.getEat()+"----"+d.getSleep());
		d.lookHome();
	}
}

オブジェクトのインスタンス化プロセス:
Person p = new Person();
1/jvmは指定されたパスの下のPersonを読み出す.classファイルはメモリにロードされ、直接親がいる場合はPersonの親が先にロードされます.
2/メモリにスペースを開き、アドレス値を割り当てます.
3/およびオブジェクト空間で、オブジェクトのプロパティをデフォルトで初期化します.
4/対応するコンストラクション関数を呼び出して初期化します.
5/コンストラクション関数では、最初の行が親クラスのコンストラクション関数を呼び出して初期化されます.
6/親クラスの初期化が完了したら、子クラスのプロパティを表示して初期化します.
7/サブクラス構築関数の特定の初期化を行う.
8/初期化が完了したら、参照変数にアドレス値を割り当てます.