Javaキーワードのabstract使い方

4630 ワード

この文章は主にabstract修飾子の使い方、abstractとインタフェースの比較、よくある面接問題を分析します.
文章の部分の内容はネットから来て、転載して出典を明記して下さい、そして作者IDをマークします:Soinice
abstractの概要
文字通り抽象的で、abstractは一般的にクラスと方法を修飾するために用いられる.
抽象とは,一つのオブジェクトをそれぞれの属性を解析し,表現の代わりにする手法である.吸うのは引き離すことです.象を表す.表示される部分.
簡単に言えば、「抽象は正しい角度から、対象のいくつかの詳細を明らかにするだけだ」ということです.
オブジェクト向けプログラミング理論では、抽象は抽象オブジェクトを定義する言語の基礎に関連し、どのように動作し、どのように状態を取得し、変更し、システム内の他のオブジェクトと「コミュニケーション」を行うかに関連します.
抽象はいかなるプログラミング言語においても多くの面で機能する.サブルーチンの作成からインタフェースの定義に至るまで、設計モードなどの低レベル言語呼び出しが生成されます.
『Javaプログラミング思想』第9章インタフェースには、次のような言葉があります.
「このため、Javaは抽象的な方法というメカニズムを提供しています.この方法は不完全で、宣言だけで方法体がありません.
抽象メソッドを含むクラスを抽象クラスと呼ぶ.クラスに1つ以上の抽象メソッドが含まれている場合は、クラスを抽象化に限定する必要があります.(そうでなければ、コンパイラはエラーを報告します)」
abstractの使い方
修飾方法
abstract修飾法は,この方法を抽象的な方法,すなわち宣言のみで実現せず,サブクラス書き換えを必要とする.注意:
  • 抽象メソッドのあるクラスは抽象クラスに違いないが、抽象クラスには抽象メソッドがあるとは限らない.
  • 親は抽象クラスであり、その中に抽象メソッドがある場合、子クラスは親クラスを継承し、親クラスのすべての抽象メソッドを実現します.子クラスはオブジェクトインスタンスを作成する能力があります.そうしないと、子クラスも抽象クラスでなければなりません.抽象クラスには構築方法があり、サブクラスはサブクラスオブジェクトを構築する際に親(抽象クラス)の構築方法を呼び出す必要がある.
  • 抽象メソッドはprivateで修飾できません.抽象メソッドはクラスに書き換えられなければならないため、private権限はサブクラスにとってアクセスできないため、矛盾が発生します.
  • 抽象メソッドもstaticで修飾することはできません.staticで修飾すれば、クラス名で直接呼び出すことができますが、抽象メソッドには主体がなく、ビジネスロジックがなく、意味がありません.

  • 修飾クラス
    abstractはクラスを修飾し、クラスを抽象クラスにします.抽象クラスはインスタンスを生成できませんが、オブジェクト変数として宣言できるタイプ、つまりコンパイル時のタイプです.抽象クラスはクラスの半製品に相当し、サブクラスが継承して上書きする方法が必要です.注意:
  • 抽象クラスはインスタンス化できないが,独自の構造方法がある.
  • 抽象クラスとインタフェース(interface)には大きな違いがあり、インタフェースにはビジネスロジックを実現するためのインスタンスメソッドがなく、抽象クラスにはインスタンスメソッドがあり、ビジネスロジックを実現することができる.
  • 抽象クラスはfinalによって修飾されない.finalによって修飾されたクラスは継承されないため、抽象クラスにとって継承によって抽象方法を実現する必要がある.

  • 抽象クラスの多態性
    abstract class E{
        // public abstract    
        public abstract void show();
    }

    その後、他のクラスは、通常、その中の方法を実現するために継承されます.
    class F extends{
        void show(){
                     
        }
    }

    最後に、メインメソッドで親参照が子オブジェクトを指すことを定義すると、たとえば多態現象が発生します.
    E e = new F();
    e.show();    

    実際にサブクラス内のnew()メソッドを呼び出した.
    抽象クラスの構築方法
    public abstract class Car {
    	
         Car(){
              System.out.println("          ");
         }
         Car(String a){
              System.out.println("        ");
         }  
          
         public void mothod1(){
              System.out.println(this.getClass());
              System.out.println("        ");
         }
    	
         public abstract void mothod2();
    	
    }
    
    
    /**
     *    
     */
    class Bicycle extends Car{
    	
         Bicycle(){
          System.out.println("        ");
         }
    	
         @Override
         public void mothod2() {
            //        mothod2
         }
    }
    
    
    /**        **/
    public class Test {
    
         public static void main(String[] args) {
              Bicycle b = new Bicycle();
              b.mothod1();
         }
    }

    出力:
              
            
    class com.shaolin.service.impl.Bicycle
            

    上記の例から、
  • 抽象クラスには構築方法があります(もちろん、書かないと、コンパイラは自動的に無パラメトリック構築方法をデフォルト化します).また、結果として、通常の継承クラスと同様に、newサブクラスオブジェクトの場合、親クラス(ここでは抽象クラスCarを指す)のコンストラクタを優先的に呼び出して初期化し、サブクラスのコンストラクタを呼び出す.抽象的な方法がインスタンス化できないのにコンストラクタがあるのはなぜなのか、という疑問があると思います.この問題についてはネット上でも諸説あり、答えは確定していない.継承の範疇にも属している以上、サブクラスがオブジェクトを作成するときは、親クラスの属性変数とインスタンスメソッドを優先的に初期化する必要があります.そうしないと、サブクラスはどのように継承して呼び出されますか.それ自体が不確定なオブジェクトであるため、インスタンス化できない場合は、オブジェクトを介してそれ自体の抽象的なメソッドを呼び出すのに問題があるのではないでしょうか.だから実例化できないのは理にかなっている.だから皆さんはこの規定を覚えていればいいです.
  • 抽象クラスの非statci(静的)および非abstract(抽象的)メソッドのthisキーワード(静的メソッドにはキーワードthisは存在しない.staticメソッドは直接クラス名で呼び出すことができるため、thisはオブジェクトを指し、インスタンス化されずにオブジェクトがないため、staticメソッドではthisを使用しない)は抽象クラス自体ではなく継承クラスを表す.これは理解しやすい.抽象クラス自体はインスタンス化できないからです.複数の継承クラスがある場合、thisを呼び出す人は誰を表します.

  • abstractとインタフェースの違い
  • 抽象クラスには、通常のメンバー変数があり、インタフェースには通常のメンバー変数がありません.
  • 抽象クラスとインタフェースには静的メンバー変数が含まれ、抽象クラスの静的メンバー変数へのアクセスタイプは任意であってもよいが、インタフェースで定義された変数はpublic static finalタイプにすぎず、デフォルトはpublic static finalタイプである.
  • 抽象クラスには構造方法があり、インタフェースには構造方法があり得ない.
  • 抽象クラスには静的メソッドが含まれ、インタフェースには静的メソッドが存在しない.ここでは,静的手法は書き換えないように注意し,次にここの静的手法は抽象的ではなく具体的に実現しなければならない.Java 8ではインタフェースに静的メソッドを含めることができ、インタフェースで直接呼び出すことができます.
  • 抽象クラスにおける抽象メソッドのアクセスタイプはpublic,protectedであってもよいが、インタフェースにおける抽象メソッドはpublicタイプのみであり、デフォルトはpublic abstractタイプである.
  • クラスは、複数のインタフェースを実装できますが、抽象クラスは1つしか継承できません.

  • abstractのいくつかの面接問題について
    基本的に上記の記録ではこの10の質問に答えることができます.
  • 抽象クラスにはmainメソッドがあります.
  • は抽象クラスでインタフェースを実現することができ、このときインタフェースを実現するすべての方法は必要ありません.

  • まとめ
    抽象クラスにはどんなメリットがありますか?
  • 抽象クラスはインスタンス化できないため,最大の利点はメソッドのオーバーライドによって多状態の属性を実現することである.すなわち、ランタイムバインディング
  • 抽象クラスは物事の共通性のものを抽出し、サブクラスから継承して実現し、コードが拡張しやすく、メンテナンスしやすい.