JAVAでのインタフェースと抽象クラス(回転)

3575 ワード

オブジェクト向けの概念では、すべてのオブジェクトがクラスによって描かれていることを知っていますが、すべてのクラスがオブジェクトを描くために使われているわけではありません.1つのクラスに特定のオブジェクトを描くのに十分な情報が含まれていない場合、このようなクラスは抽象クラスです.
  
抽象類は往々にして私たちが問題分野を分析し、設計した抽象概念を特徴付けるために用いられ、一連の見た目は異なるが、本質的に同じ具体的な概念の抽象であり、それらを実例化することはできない(具体的なものは出せない)ので抽象と呼ぶ.例えば、私たちは「果物」を説明します.それは抽象的で、品質、体積などの共通性がありますが(果物には品質があります)、特性に欠けています(りんご、みかんはすべて果物で、それらは自分の特性があります)、私たちは果物を代表する唯一の東西(りんご、みかんは果物を代表できないため)、抽象類で説明することができます.したがって抽象クラスはインスタンス化できない.あるクラスで「りんご」を具体的に説明すると、このクラスは「果物」を説明する抽象的なクラスを継承することができ、「りんご」は「果物」であることを知っています.
オブジェクト向けの領域では、抽象クラスは主にタイプ非表示に使用されます.固定された一連の挙動の抽象的な記述を構築することができるが,この一連の挙動には任意の可能な具体的な実装方法がある.この抽象記述は抽象クラスであり、この任意の可能な具体的な実装のセットは、この抽象クラスのすべての派生クラスとして表現される.
インタフェースと抽象クラスのすべての抽象メソッドには具体的な実装はできませんが、それらのサブクラスですべての抽象メソッド(関数体があっても{}に空であっても)を実装する必要があります.javaの設計者は抽象メソッドの柔軟性を考慮し、各サブクラスは自分のニーズに応じて抽象メソッドを実装することができます.
 
抽象クラス(abstract class)の定義方法は次のとおりです.  public abstract class AbstractClass            //少なくとも一つの抽象的な方法があります   public int t; //一般データ・メンバー public abstract void method1();  //抽象メソッド、抽象クラスのサブクラスはクラスの中で抽象クラスの中の抽象メソッドを実現しなければならない   public abstract void method2();     public void method3();  //非抽象メソッド   public int method4();    publi int method4 (){         …… //抽象クラスには非抽象メソッドメソッドのデフォルト動作、すなわちメソッドの具体的な実装を与えることができる.   }
       public void method3(){         …… //抽象クラスには非抽象メソッドメソッドのデフォルト動作、すなわちメソッドの具体的な実装を与えることができる.   } 
}
 
インタフェース(interface)の定義は次のとおりです.  public interface Interface {     static final int i; //インタフェースには通常のデータメンバーは存在せず、静的で修正できないデータメンバーのみが存在し、staticはグローバルを表し、finalは修正不可を表し、static finalは使用しなくてもよい 修飾、staticとfinalとして暗黙的に宣言されます   
   public void method1(); //インタフェースの方法は抽象的な方法に違いないのでabstract修飾は必要ありません   
   public void method2();  //インタフェースにメソッドを付与できないデフォルトの動作、すなわちメソッドの具体的な実装ができない}
しかしインタフェースにはメソッドがありません.メソッドボディは、1つの特定のクラスでしか実現できません.
簡単に言えば抽象クラスは機能不全のクラスであり,インタフェースは抽象メソッド宣言と静的に修正できないデータの集合にすぎず,両者ともインスタンス化できない.ある意味では、インタフェースは特殊な形式の抽象クラスであり、java言語では抽象クラスは継承関係を表し、1つのクラスは1つの抽象クラスしか継承できないが、1つのクラスは複数のインタフェースを実現することができる.多くの場合、インタフェースは抽象クラスの代わりに使用できます.属性の継承を意図的に表現する必要がなければ.
 
     :

public class Chinese implements People{

public void say() {

System.out.println("   !");

}

}

     :

People chinese = new Chinese() ;

chinese.say();

  
 
 
 
さらに、javaが抽象クラス、インタフェースを導入する目的について、達人に教えてもらった答えは以下の通りです.
 
1、クラスの階層構造から見ると、抽象クラスは階層の先端にあるが、実際の設計では、一般的に抽象クラスは後で現れるべきである.どうして?実際に抽象クラスの取得は数学の抽出公因式に似ています:ax+bx、xは抽象クラスで、もしあなたが前の式がなければ、あなたはどうしてxが公因式かどうかを知っていますか?この点では、人々が世界を認識する過程にも合致し、まず具体的に抽象的である.そのため、設計の過程で多くの具体的な概念を得て、そこからその共通性を見つけた場合、この共通性の集合は抽象クラスであることは間違いないはずです.  2、interfaceは表面的には抽象類と似ているが、使い方は全く異なる.その基本的な機能は、関連のないクラス(概念)を集めて、新しい、集中的に操作できる「新しいクラス」を形成することです.私が学生にあげた典型的な例は「運転手」です.誰が運転手になれるの?誰でもいいです.免許さえ取れば.だから私はあなたが学生であろうと、ホワイトカラーであろうと、ブルーカラーであろうと、ボスであろうと、免許さえあれば運転手です.  interface DriverLicence {  Licence getLicence();  }
class StudentDriver extends Student implements DriverLicence {  }  class WhtieCollarEmployeeDriver extends WhtieCollarEmployee implements DriverLicence {  }  class BlueCollarEmployeeDriver extends BlueCollarEmployee implements DriverLicence {  }  class BossDriver extends Boss implements Driver {  }
「自動車」類を定義すると、「運転手」を指定することができます.
class Car {  setDriver(DriverLicence driver);  }  このとき、Carの相手はこの運転手が何をしているのか気にしない.彼らの唯一の共通点は免許を取ったことだ(DriverLicenceインタフェースが実現した).これは、インタフェースが最も強いところであり抽象類とは比べものにならない.        まとめ:抽象クラスは具体的なクラスを抽出する公因式であり、インタフェースは関連のないクラスを共通のグループにまとめるためである.通常、javaは単一継承であり、C++とは異なるが、抽出クラスを使用する必要がある場合は必ず使用する(gotoのような使い方がある)あ、ふふ.JAVAのインタフェースと抽象クラス