黒馬プログラマー——Javaオブジェクト向け抽象クラスインタフェース内部クラスノート

7283 ワード

------Javaトレーニング、Androidトレーニング、iOSトレーニング、.Netトレーニング、お客様とのコミュニケーションを期待しています!------
三、抽象クラスの概要:Javaでは、メソッドボディのないメソッドを抽象メソッドとして定義する必要がありますが、クラスに抽象メソッドがある場合は、クラスを抽象クラスとして定義する必要があります.親またはインタフェース参照が自分のサブクラスオブジェクトを指すクラス変数=newは前のクラスとは異なる()前:親、インタフェースの後:子または実装クラス ,呼び出しメソッドサブクラス書き換え抽象クラス特徴1)抽象クラスと抽象メソッドはabstractキーワード修飾フォーマットabstract classクラス名{}public abstract void eat()でなければならない.2)抽象類には必ずしも抽象的な方法があるとは限らず,抽象的な方法がある類は必ず抽象類抽象類は実例化できない3)多態的な方式で具体的なサブクラスによって実例化される.実はこれも多態の一種で、抽象類多態です.抽象クラスのサブクラス、抽象クラスか、抽象クラスのすべての抽象メソッドを書き換えるか.抽象クラスのメンバーの特徴      1)メンバー変数は変数であっても定数であってもよい2)構築方法には構築方法があるが,構築方法をインスタンス化できないのは,サブクラスが親データにアクセスするための初期化である.
3)メンバーメソッドは、サブクラスが何らかの動作を完了しなければならないことを抽象的な方法で定義することもできるし、非抽象的な方法でコードの多重性を向上させることもできる.例:
/*
	  :   \   \   \

	  :   \  \  \     
*/
//   
abstract class Employ{

	 //    ,     
	 private String name;
	 private String id;

	 //    ,     
	 Employ(String name,String id){
		 this.name=name;
		 this.id=id;
	 }
	public void setName(String name){
		this.name=name;
	}
	public String getName(){
		return name;
	}
	public void setId(String id){
		this.id=id;
	
	}
	public String getId(){
		return id;
	}
	//    ;
	abstract void work();
}
//   
class Proger extends Employ{
	//     
	Proger(String name,String id){
		//    ,
		super(name,id);
	
	}
	//         
	void work(){
		System.out.println("   "+getName()+"   "+getId()+"   ");
	}
}
//     
class Manager extends Employ{
	Manager(String name,String id,double bonus ){

		super(name, id);//         .

		this.bonus=bonus;//         

	}
	//        .           .                  .
	double bonus;
	//        
	void work(){
		System.out.println("   "+getName()+"   "+getId()+"   "+bonus+"    ");
	}

}
class YuanGongDemo{
	public static void main(String[]args){
		new Proger("  ","   001").work();
		new Manager("  ","   002",1987367.89).work();
	}
}

abstractキーワード:
これらのキーワードと共存できない
private
コンフリクト
final
 コンフリクト
static
意味がない
四、インタフェースの概要
インタフェースメンバー定義
1)変数固定フォーマット修飾子は完全でなければならない
public static final
2)メソッド固定フォーマット抽象メソッド、修飾子は完全でなければならない
public abstract 
インタフェースには構造方法がない、インタフェースは主に拡張機能であり、具体的には存在しないからである.
3)インタフェースキーワードinterfaceの定義
インタフェースキーワードimplementsの実装
フォーマット:classクラス名implementsインタフェース名{}
4)インタフェースの使用
   実装クラスを定義し、インタフェースがすべての抽象メソッドを書き換えることを実現し、実装クラスオブジェクトを確立する.
マルチステート呼び出し可能
 
5)関係
クラスとクラス
継承関係は、単一のみ継承できますが、多層継承できます.
クラスとインタフェース
関係を実現するには、単に実現してもよいし、多く実現してもよい.1つのクラスを継承しながら複数のインタフェースを実装することもできます.
インタフェースとインタフェース
継承関係は、単独で継承してもよいし、複数で継承してもよい.
6)抽象クラスとインタフェースの違い
メンバーの違い
抽象クラス変数、定数;抽象的な方法がある.抽象メソッド、非抽象メソッド
インタフェース定数;抽象メソッド
関係の違い
クラスとクラスの継承、単一の継承
クラスとインタフェースの実装、単一実装、マルチ実装
インタフェースとインタフェースの継承、単一継承、マルチ継承
デザインコンセプトの違い
抽象クラスが継承されるのは,「is a」の関係である.きょうせいきのう
インタフェースが実装されるのは,「like a」の関係である.拡張機能
例:
interface MyInterface
{
	public static final int X = 1;
	public abstract void show();
	public abstract void show2();
}
//     ,    ,        
class MyInterfaceImpl implements MyInterface
{
	public void show(){
	  System.out.println("   ,          ");
	}
}

class InterfaceDemo1 
{
	public static void main(String[] args) 
	{
		//              
		System.out.println(MyInterface.X);
		//      ,        
		System.out.println(MyInterfaceImpl.X);

		
		MyInterfaceImpl my = new MyInterfaceImpl();
		my.show();
		//      ,          
		System.out.println(my.X);
	}
}

例:ノートブックの拡張機能
//     
interface USB{
	public abstract void open();
	public abstract void clase();

}
//   
class BookPC{
	public static void main(String[]args){
		 useUSB(null);
			
	}

	public static void useUSB(USB u){
		u.open();
		u.close();
	}
}
//    USB  
class Upan implements USB {
	public abstract void open(){
		System.out.println("Upan   ");
	}
	public abstract void close(){
		System.out.println("Upan   ");
	}

}

五、内部クラスの概要
(メンバー内部クラス、ローカル内部クラス、匿名内部クラス)
クラスを他のクラスの内部に定義し、このクラスを内部クラスと呼ぶ.
   例:クラスAにはクラスBが定義されており、クラスBは内部クラスである.
内部クラスのアクセス機能:
内部クラスは、プライベートを含む外部クラスのメンバーに直接アクセスできます.
外部クラスが内部クラスのメンバーにアクセスするには、オブジェクトを作成する必要があります.
1)、メンバー内部クラス
外部クラスのメンバーの場所を定義します.
内部クラスオブジェクトを作成するとき:
   外部クラス名.内部クラス名オブジェクト名=外部クラスオブジェクト.内部クラスオブジェクト;
例:
/*
             
*/
interface A
{
	void inner();
}

class Outer
{
	//     ,          
	private class Inner implements A

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

	public A get(){
		return new Inner();
	}
}

class InnerClassDemo3 
{
	public static void main(String[] args) 
	{
		Outer o = new Outer();
		A a = o.get();
		a.inner();
		//Outer.Inner i = o.get();
	}
}

例:
class Outer1
{
	int x = 1;
	class Inner
	{
		int x = 2;
		public void show(){
		   int x = 3;
		   //  1
		   System.out.println(Outer1.this.x);
		   //  2
		   System.out.println(this.x);
		   //  3
		   System.out.println(x);
		}
	}
}

public class ChengYuanNeibuLei 
{
	public static void main(String[] args) 
	{
		//       
		Outer1.Inner oi = new Outer1().new Inner();
		//         
		oi.show();
	}
}
例:
/*
        

*/
class Outer{
    
	 static class Inter{

		static void show(){

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


class IOterDemo{
	public static void main(String[]args){

		 new Outer().new Inter().show();//   \        

		 Outer.Inter.show();//      ,       .new Outer. Inter().show();   .

		new Outer.Inter().show();//      ,       .

		//        ,            .        .

	}
}

2)ローカル内部クラス
例:
/*
   ローカル内部クラス、外部クラスに定義されたメソッド
   ローカル内部クラスのメンバーにアクセスするには、外部クラスメソッドに依存するしかない.
   1)なぜ、ローカル内部クラスは、ローカル変数にアクセスし、finalを追加しなければならないのか
   理由:ライフサイクル
   2)finalを加えるとなぜコンパイルが成功し,実行できるのか
   理由:javac 検出コードの構造 変数の値、終身不変
   コンパイルするとき、内部クラスのメソッドx変数は、直接5に置き換えられます.
*/
interface A
{
	void inner();
}
class Outer
{
	//        
	public A out(){
		//   final  
	   final int x = 5;
	   //           .         A
	   class Inner implements A
	   {
		   public void inner(){
		     System.out.println("abc "+x);
		   }
	   }
		//               .
	   return new Inner();
	}
}

class  InnerClassDemo4
{
	public static void main(String[] args) 
	{
		Outer o = new Outer();
		A a = o.out();
		//           (  inner()),         .
		a.inner();
			
	}
}

3)匿名内部クラス
 
書式:
new親またはインタフェース(){
 親クラスまたはインタフェース抽象メソッドの書き換え
};
匿名クラスの前提:親クラスを継承するか、インタフェースを実装する.
        クラス実装インタフェースステップ:書き換え方法、実装クラスオブジェクトを確立し、書き換え方法を呼び出す.
匿名の内部クラスは、上記のステップを簡略化する:ステップ実装の目的を達成する.例:ステップ実装の例
//    
interface MyInter{
	//    
	public abstract void show();
}

//      
class MyInterImpl implements MyInter{

	public void show(){

		System.out.println("          ");
	}

	//         
	public void show1(){
	}
	public void show2(){
	}
}

//     
class NiMIngDemo{
	public static void main(String[]args){

		//  new   
		new MyInter(){

			//            
			public void show(){
			System.out.println("          ");
		}
		//new    ,        ,         .       
	}.show1();
}