抽象クラスとインターフェースについて知っておくべきこと(インタビュー)

1.抽象クラス:

(1)抽象修飾子を含むクラスは抽象クラスです。メソッドの前にabstractキーワードを追加して、これが抽象メソッドであることを示します。同時に、抽象メソッドにはメソッド本体がありません({}がないと、特定のコードを実行できません)

abstract class Shape {
    
     
    abstract public void draw(); 
}

(2)抽象クラスはインスタンスオブジェクトを作成できません

Shape shape = new Shape(); 
// 编译出错
Error:(30, 23) java: Shape是抽象的; 无法实例化

(3)抽象メソッドをプライベートにすることはできません

abstract class Shape {
    
     
    abstract private void draw(); 
} 
// 编译出错
Error:(4, 27) java: 非法的修饰符组合: abstractprivate

(4)抽象クラスには、他の非抽象メソッドを含めることも、フィールドを含めることもできます。この非抽象メソッドと通常のメソッドのルールは同じであるか、オーバーライドするか、サブクラスから直接呼び出すことができます。

abstract class Shape {
    
     
    abstract public void draw(); 
    void func() {
    
     
        System.out.println("func"); 
    } 
} 
class Rect extends Shape {
    
     
 ... 
} 
public class Test {
    
     
    public static void main(String[] args) {
    
     
        Shape shape = new Rect(); 
        shape.func(); 
    } 
} 
// 执行结果
func

2.インターフェース:

(1)インターフェース(インターフェース)は抽象クラスの特殊なケースであると言えます。インターフェース内のすべてのメソッドは抽象でなければなりません。インターフェイスのメソッド定義はデフォルトでpublicabstractタイプになり、インターフェイスのメンバー変数タイプはデフォルトでpublic staticfinalになります。
インターフェイスを個別にインスタンス化することはできません

interface IShape {
    
     
    void draw(); 
    public static final int num = 10;
} 
class Cycle implements IShape {
    
     
    @Override 
    public void draw() {
    
     
        System.out.println("○"); 
    } 
}  
public class Test {
    
     
    public static void main(String[] args) {
    
     
        IShape shape = new Rect(); 
        shape.draw(); 
    } 
}

(2)クラスを複数の親クラスから継承させる必要がある場合があります。一部のプログラミング言語では、複数の継承によるこの問題は、ある方法で実装されます。
ただし、Javaでは単一の継承のみがサポートされ、クラスは親のみを拡張できます。クラスですが、複数のインターフェイスを同時に実装できます。複数の継承によって同様の効果が得られます。
ここで、クラスを使用して動物のグループを表します。

// 定义一个父类 动物
class Animal {
    
     
    protected String name; 
    public Animal(String name) {
    
     
        this.name = name; 
    } 
}

// 定义三个接口
interface IFlying {
    
     
    void fly(); 
} 
interface IRunning {
    
     
    void run(); 
} 
interface ISwimming {
    
     
    void swim(); 
}

// 创建一个子类 猫
class Cat extends Animal implements IRunning {
    
     
    public Cat(String name) {
    
     
        super(name); 
    } 
    @Override 
    public void run() {
    
     
        System.out.println(this.name + "正在用四条腿跑"); 
    } 
}

// 创建一个子类 鸭子
class Duck extends Animal implements IRunning, ISwimming, IFlying {
    
     
    public Duck(String name) {
    
     
        super(name); 
    } 
    @Override 
    public void fly() {
    
     
        System.out.println(this.name + "正在用翅膀飞"); 
    } 
    @Override 
    public void run() {
    
     
        System.out.println(this.name + "正在用两条腿跑"); 
    } 
    @Override 
    public void swim() {
    
     
        System.out.println(this.name + "正在漂在水上"); 
    } 
}

多態性の利点により、プログラマーは型を忘れてしまいます。インターフェイスを使用すると、クラスのユーザーは特定のタイプに注意を払う必要はなく
、特定のクラスに特定の機能があるかどうかにのみ注意を払うことできます。

(3)インターフェース間の継承:
インターフェースはインターフェースを継承して再利用の効果を実現できます。extendsキーワードを使用してください。

interface IRunning {
    
     
    void run(); 
} 
interface ISwimming {
    
     
    void swim(); 
} 
// 两栖的动物, 既能跑, 也能游
interface IAmphibious extends IRunning, ISwimming {
    
     
} 
class Frog implements IAmphibious {
    
     
 ... 
}

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

主な違い:
抽象クラスには通常のメソッドと通常のフィールドを含めることができます。このような通常のメソッドとフィールドはサブクラスで直接使用できますが(書き換えなし)、インターフェイスには通常のメソッドを含めることはできません。サブクラスはすべての抽象メソッドを書き換える必要があります。
(抽象クラスの意味は、コンパイラがより適切に検証できるようにすることです)

抽象クラス インターフェース
通常のクラス+抽象(非抽象)メソッド+構築メソッド 抽象メソッド+グローバル変数
さまざまな権限 公衆
拡張を使用して抽象クラスを継承します 実装を使用してインターフェイスを実装する
抽象クラスはいくつかのインターフェースを実装できます インターフェイスは抽象クラスを継承できませんが、インターフェイスはextendsを使用して複数の親インターフェイスを継承できます
サブクラスは1つの抽象クラスのみを継承できます サブクラスは複数のインターフェースを実装できます

ここで友達に会ったら、役に立つと思ったら気に入って、気をつけて行ってください!

おすすめ

転載: blog.csdn.net/qq_45658339/article/details/109259398