Javaのインターフェースと抽象クラス

「JavaProgrammingThoughts」という本では、抽象クラスは「抽象メソッドを含むクラス」と定義されていますが、クラスに抽象メソッドが含まれていない場合、抽象で装飾されているだけであれば抽象クラスでもあります。

抽象クラスが继承存在することになっています。親クラスの場合、そのメソッドの1つが存在する父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现場合、このメソッドは抽象メソッドとして宣言でき、この時点でこのクラスは抽象クラスになります。

抽象クラスには抽象メソッドが必要ですか?

    abstract class Cat {
    
    			
       	public static void sayHi() {
    
    
      		  System. out. println("hi~");
        }
        public String test1() {
    
    
    		System. out. println("抽象类不一定非要有抽象方法");
    		return "hello world";
    	}
    }

上記のコードでは、抽象クラスには抽象メソッドはありませんが、正常に実行できます。

通常のクラスと抽象クラスの違いは何ですか?

抽象クラスを直接インスタンス化することはできません。抽象クラスには具体的な実装がないメソッドが含まれているため、抽象クラスを使用してオブジェクトを作成することはできません。通常のクラスには抽象メソッドを含めることはできず、通常のクラスは直接インスタンス化できます。
ここに画像の説明を挿入
抽象类中非抽象方法必须实现

ここに画像の説明を挿入

  1. 抽象クラスは直接インスタンス化することはできず、継承にのみ使用できます
  2. サブクラスが抽象クラスを継承した後、親クラスのすべての抽象メソッドを実装する必要があります。抽象クラスの派生サブクラスがその中のすべての抽象メソッドを実装しない場合でも、派生サブクラスは抽象クラスであり、インスタンスではなく、継承に使用されます。変更
  3. 抽象メソッドがクラスで定義されている場合、クラスは抽象クラスとして定義する必要がありますが、抽象クラスは抽象メソッドを持つこともできないこともあります
  4. 构造方法和静态方法不可以修饰为abstract!!!(注:静的と抽象は絶対に相互に排他的ではありません。2つはメソッドを同時に変更することはできませんが、内部クラスを同時に変更することはできます)
  5. 抽象メソッドはパブリックまたは保護されている必要があり(プライベートの場合、サブクラスに継承できず、サブクラスはメソッドを実装できないため)、デフォルトはデフォルトでパブリックです。

抽象クラスとインターフェイスの違いは何ですか?

インターフェースとは、人々が呼び出したり機能したりするためのメソッドを指し、行为抽象的です。(インターフェースは抽象クラスの変形であり、抽象クラスよりも抽象的です)、インターフェースはインターフェースキーで装飾されています。

[修饰符] [abstract] interface InterfaceName  [extends 父接口1,父接口2]{
    
    	
}

インターフェイス内の変数は、暗黙的にpublic static final変数として指定されます(privateで変更されたpublic static final変数のみがコンパイルエラーを報告します)。つまり接口中的变量都为常量、通常、インターフェイスでは定義されません。抽象クラスは(通常のクラスのように)独自のメンバー変数を持つことができ、それらの値は再定義してサブクラスに割り当てることができます

始まってjdk1.8、インタフェースのメソッドは、もはやだけ持つことができない抽象メソッドを(通常の方法では、暗黙的にパブリック抽象メソッドとして指定されます)、それはまた、静的メソッドとデフォルトのメソッドを持つことができます。そして、静的メソッドとデフォルトメソッドはメソッド本体を持つことができます実装クラスは、インターフェースに抽象メソッドを実装するだけで済みます。

public interface NewInterface {
    
    
    static void staticMethod() {
    
    
        System.out.println("staticMethod");
    }
 //使用default关键字修饰的方法
    default void defaultMethod() {
    
    
        System.out.println("defaultMethod");
    }
 
    public void getInfo();
}

静的メソッドの場合、それらはインターフェース名によって直接呼び出され、インターフェース実装クラスのオブジェクトによって呼び出される必要はありません。NewInterface.staticMethod();
デフォルトのメソッドの場合、それを呼び出すにはインスタンスオブジェクトが必要です。new SimpleImpl()。defaultMethod();

 //当一个类实现了多个接口之后,如果多个接口有着相同的default方法,即方法名和参数列表相同
//会无法识别到底是调用的哪个接口的default方法
public class SimpleImpl implements NewInterface {
    
    
    @Override
    public void getInfo() {
    
        
        System.out.println("INFO");
        defaultMethod();
    }    
 //必须要在实现类里面显式重写default的方法
 //在实现类中不需要继续出现default关键字也不能出现default关键字**。
    public void defaultMethod() {
    
    
        System.out.println("Impl default Method");
    }
}

デフォルトのメソッドは、明示的なアクセス修飾子がないことを除いて、パブリックアクセス修飾子でのみ変更できるため、オーバーライドされたデフォルトメソッドに必要なアクセス許可はパブリックである必要があります。Javaでは、アクセスするメソッドを書き直す必要があることがわかっています。修飾子は、親クラスまたはインターフェイスで指定されたアクセス修飾子の範囲以上である必要があり、メソッド宣言でスローされる例外も後者より大きくなければなりませんしたがって、アクセス権限はパブリックである必要があります。

最後に、デフォルトのメソッドと実装クラスに継承された親クラスのメソッドの名前が同じ場合、最初に親クラスのメソッドが呼び出されます。

抽象クラスとインターフェースの違い

抽象クラスはある種のものの抽象化、つまりクラスの抽象化であり、インターフェースは動作の抽象化です。抽象クラスは、属性と動作を含むクラス全体を抽象化しますが、インターフェースはクラスの一部(動作)を抽象化します。

実装:抽象クラスのサブクラスは、拡張を使用して継承します。インターフェイスは、実装を使用してインターフェイスを実装する必要があります。
コンストラクター:抽象クラスはコンストラクターを持つことができますが、インターフェースは持つことができません。
実装の数:クラスは多くのインターフェースを実装できますが、継承できる抽象クラスは1つだけです。
アクセス修飾子:インターフェイスのメソッドはデフォルトでパブリック変更を使用します。抽象クラスのメソッドは任意のアクセス修飾子にすることができます。

設計概念:抽象クラス(is-aリレーションシップ)インターフェース(like-a Relationship)
継承は「正しいか」の関係であり、インターフェース実装は「あるかどうか」の関係です。クラスが抽象クラスを継承する場合、サブクラスは抽象クラスのタイプである必要があり、インターフェイスの実装は、鳥が飛ぶことができるかどうか(または飛ぶ特性があるかどうか)など、関係があるかどうかに関連しています。飛ぶことができますこのインターフェースを実装できますが、飛べない場合はこのインターフェースを実装しません。

インターフェイスと抽象クラスの違い
参照:Javaのインターフェース(jdk1.8)と抽象クラス

抽象クラスは最終変更を使用できますか?
いいえ、抽象クラスの定義は他のクラスに継承させることです。finalとして定義されている場合、クラスを継承できず、競合が発生するため、finalは抽象クラスを変更できません。図に示すように以下では、エディターはエラーメッセージも表示します。
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/eluanshi12/article/details/96284250