継承の概要と特徴、方法書き換えの応用シーン&注意事項

6543 ワード

第1章相続1.1相続の概要現実生活において、相続とは一般的に子供が親の財産を相続することを指す.プログラムでは、継承は物事間の所属関係を記述し、継承によって多くの物事間に関係体系を形成することができる.1.2継承されたフォーマット&プログラムで使用し、あるクラスが別のクラスを継承することを宣言するにはextendsキーワードを使用する必要があります.
      :
    class    extends    {}

1.3継承の特徴はクラスの継承の中で、いくつかの問題に注意しなければならない.class A{}class B{}class C extends A,B{}//CクラスはAクラスとBクラス2を同時に継承することはできません.複数のクラスは親クラスを継承することができます.たとえば、次の場合は許可されます.class A{}class B extends A{}class C extends A{}//クラスBとクラスCはクラスA 3を継承することができ、Javaでは多層継承が可能である.すなわち、1つのクラスの親は別の親を継承することができ、例えばCクラスはBクラスから継承することができ、BクラスはAクラスを継承することができる.この場合、CクラスはAクラスの子クラスとも呼ばれる.次のような状況は許可されています.class A{}class B extends A{}//クラスB継承クラスA、クラスBはクラスAのサブクラスclass C extends B{}//クラスC継承クラスB、クラスCはクラスBのサブクラスであり、クラスAのサブクラス4でもある.Javaでは、サブクラスと親クラスは相対的な概念であり、つまり、あるクラスがあるクラスの親であると同時に、別のクラスのサブクラスであってもよい.例えば上記の場合、BクラスはAクラスの子であり、Cクラスの親でもある
package demo;

/*
 * Java      :
 * 			Java         ,        (           )
 * 			Java        (           ,         )
 * 
 */
public class ExtendsDemo2 {
	public static void main(String[] args) {
		LOL l = new LOL();
		l.update();
		l.start();
	}
}

class Game {
	public void start() {
		System.out.println("     ");
	}
}

class PCGame extends Game {
	public void update() {
		System.out.println("PCGame   ");
	}
}

class MobileGame extends Game {
	public void update() {
		System.out.println("MobileGame   ");
	}
}

class LOL extends PCGame {

}


1.4継承中のメンバー変数の特徴A:子クラスは親非プライベートメンバーの子親クラスのメンバー変数の名前が異なる場合のみ親クラスのメンバー変数を直接取得する子親クラスのメンバー変数の名前が同じ場合は子クラスのメンバー変数を取得する
B:近接の原則:誰が私に近いのか、誰が局所変数を持っているのか、局所変数がなければ、サブクラスのメンバー変数を持っていれば、サブクラスのメンバー変数を使って、局所変数とサブクラスのメンバー変数がなければ、親クラスのメンバー変数を持っていれば、親クラスのメンバー変数C:super:親クラスのメンバー変数とメンバーメソッドを取得することができます.用法はthisと似ている
package demo;
/*
 *           
 * 		             
 * 		                         
 * 		                         
 * 
 *     :        
 * 		              
 * 		        ,                  
 * 		                ,                  
 * 		    ,   !!!
 * 
 * super:                ,   this    
 */
public class ExtendsDemo2 {
	public static void main(String[] args) {
		Kid3 k = new Kid3();
		k.show();
	}
}

class Dad3 {
	String name = "  ";
}

class Kid3 extends Dad3 {
	String name = "  ";

	public void show() {
		String name = "  ";

		System.out.println(super.name);
		System.out.println(this.name);
		System.out.println(name);
	}
}


1.5継承中のメンバーメソッドの特徴&メソッド書き換え1.5.1ケースコード4 A:子クラスにこのメソッドはなく、親クラスを呼び出す
package demo;

/*
 *           
 * 		         ,     
 
 
 */
public class ExtendsDemo2 {
	public static void main(String[] args) {
		Kid4 k = new Kid4();
		k.eat();
	}
}

class Dad4 {
	public void eat() {
		System.out.println("    ");
		System.out.println("    ");
	}
}

class Kid4 extends Dad4 {

}

1.5.2ケースコード5 B:子クラスではこのメソッドを書き換え、子クラスを呼び出すメソッドの書き換え:子クラスでは、子クラスのメソッドは親クラスと全く同じで、子クラスでは親クラスのメソッド(上書き)を書き換え、子クラスで親クラスのメソッドを書き換えた後、子クラスオブジェクトを使用して呼び出すのが子クラスのメソッドです
package demo;
/*
 *           
 * 		         ,     
 * 		          ,     
 * 
	     :      ,             ,          (  ),             ,                
 	     :     ,        ,        (     ,     ,     ),      
 
 */
public class ExtendsDemo2 {
	public static void main(String[] args) {
		Kid4 k = new Kid4();
		k.eat();
	}
}

class Dad4 {
	public void eat() {
		System.out.println("    ");
		System.out.println("    ");
	}
}

class Kid4 extends Dad4 {
	public void eat() {
		System.out.println("    ");
	}
}

1.6メソッド書き換えの適用シーン&注意事項メソッド書き換えの適用シーン:親クラスのメソッドが子クラスの使用を完全に満たすことができない場合、親の機能を保持できます(踏襲、伝承)また、独自の機能メソッド書き換えの注意点:親プライベートのメンバーメソッドを書き換えることはできません.親プライベートのメンバーサブクラス書き換え親メソッドは、親メソッドと同等の権限を持つ必要があります.注記@Override:メソッド書き換えは、次の方法が親メソッドを書き換える方法であることを示します.
package demo;

/*
 * 	         :                ,             ,
 * 				                super       ,             ,            
 *           :
 *  			             
 *  			                
 *  
 *    :@
 *  
 */
public class ExtendsTest {
	public static void main(String[] args) {
		NewPhone np = new NewPhone();
		np.call();
	}
}

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

class NewPhone extends Phone {

	@Override
	public void call() {
		System.out.println("  ");
		// System.out.println("   ");

		// super.call();
	}
}

1.7継承中の構築方法の実行順序A:super(実相リスト);文は子クラスの構築方法で使用され、親クラスの構築方法(伝達されたパラメータによって決定されるもの)を呼び出し、構築方法の最初の行でのみB:this(実パラメータリスト)を使用できます.文はクラスの構築方法で用いる、本クラスの他の構築方法(伝達されたパラメータによって決定するもの)を呼び出し、構築方法の最初の行でのみ1.7を用いる.1ケースコード7
package demo;

/*
 *             
 * 			     ,      ,         ,
 * 			                                      ,           
 *           ?
 * 			               
 *               ,              
 * 
 *          ---          ---         
 */
public class ExtendsTest {
	public static void main(String[] args) {
		// Die d = new Die();
		Zi6 z = new Zi6();
	}
}

class Die6 {
	public Die6() {
		System.out.println("        ");
	}

	public Die6(int num) {
		System.out.println("        ");
	}
}

class Zi6 extends Die6 {
	public Zi6() {
		// super(1);
		// super();

		this(1);//              

		System.out.println("        ");
	}

	public Zi6(int num) {
		//            
		System.out.println("        ");
	}
}

1.8 thisとsuperの違い1.8.1ケースコード8:
package demo;

/*
 * this super   
		this:       
			         
			         
			                     
		super:         
			         
			         
			                    
 */
public class ExtendsTest {
	public static void main(String[] args) {
		Zi z = new Zi();
		z.function();
	}
}

class Die {
	int num = 10;

	public Die() {
		System.out.println("        ");
	}

	public Die(int num) {
		System.out.println("        ");
	}

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

class Zi extends Die {
	// int num = 30;

	public Zi() {
		// this(1);//                   ,          
		super();
		System.out.println("        ");
	}

	public Zi(int num) {
		System.out.println("        ");
	}

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

	public void function() {
		// this.num = 50;
		// System.out.println(num);
		// this.method();

		// super.num = 40;
		// super.method();

		System.out.println(this.num);
	}
}

1.9メリットとデメリットを継承A:メリットコードの多重性を向上コードのメンテナンス性を向上B:デメリット:クラスの結合性が開発の原則を強化した:高集約低結合集約:自分で何かを完成する能力結合:クラスとクラスの関係