ホームページ  >  記事  >  Java  >  Java 抽象クラスとインターフェイスをマスターするにはどうすればよいですか?

Java 抽象クラスとインターフェイスをマスターするにはどうすればよいですか?

WBOY
WBOY転載
2023-05-08 08:16:071086ブラウズ

    abstract

    abstract の導入: 変更に使用できます: クラス (抽象クラス)、メソッド (抽象メソッド)

    修正された抽象class :

    ①このクラスはインスタンス化できません(つまり、このクラスのオブジェクトを作成できません)

    ②単独ではインスタンス化できませんが、サブクラスは親クラスのコンストラクターを呼び出します。したがって、抽象クラスは

    抽象変更メソッドにコンストラクターが必要です。

    ①抽象メソッドにはメソッドの宣言のみがあり、メソッド本体はありません。また、それが属するクラスは抽象でなければなりませんクラス。クラスが抽象クラスでない場合、このクラスはオブジェクトを作成でき、オブジェクトを作成できる場合は呼び出すことができるためです。逆に、抽象クラスには抽象メソッドを含めることはできません。

    ② サブクラスが親クラスの抽象メソッドをすべて書き換えればインスタンス化できますが、すべて書き換えていない場合はサブクラスも抽象クラスなのでabstractで変更する必要があります。

    ③Abstract を使用して、プライベート メソッド、静的メソッド、final キーワードで変更されたメソッド、final キーワードで変更されたクラスを変更することはできません。

    Final は明らかに継承できませんが、abstract はサブクラスの継承が必要なので使用できません。両方のメソッドが静的である場合、2 つのメソッドはオーバーライドまたはオーバーライドされているとはみなされないため、静的メソッドの変更には abstract が使用されます。 . 上書きできません。

    抽象アプリケーション

    テンプレート メソッドの設計パターン。ソフトウェア開発でアルゴリズムを実装する場合、全体的な手順は非常に固定的かつ共通であり、これらの手順は親クラスで記述され、一部の不安定で不確実な部分はサブクラスによる実装のために抽象化できます。

    抽象クラスの匿名サブクラス オブジェクト

    public static void main(String[] args){
        //匿名对象
        eat(new son());
        //非匿名类的非匿名对象
        son John=new son();
        eat(John);
        //匿名子类对象
        father f=new father(){//抽象类造对象必须要重写方法,了解看得懂就ok了。
            @Override
            public void work() {
            }
            @Override
            public void info(father i) {
            }
        };
    }
    //普通方法
    public static void eat(father f){
        System.out.println("吃饭");
    }
    //父类
    public abstract static class father{
        String name;
        int age;
        public abstract void work();//抽象方法不能有方法体
        public abstract void info(father i);
    }
    //子类
    public class son extends father{//继承
        String name;
        int age;
        @Override
        public void work(){
            System.out.println("上学");
        }
        @Override
        public void info(father i) {
            System.out.println("name:"+i.name+" age:"+i.age);
        }
    }
    //接口的匿名对象
    非匿名的对象可以被多次调用,匿名的对象只能使用一次
    Computer com=new Computer();//创建了接口的非匿名实现类(子类)的非匿名对象,类和对象都是有名的
    Flash flash = new Flash();
    //2.创建了接口的非匿名实现类的匿名对象,对象匿名了
    com.transferData(new Printer());
    //3创建了接口的匿名实现类的非匿名对象,就是类是匿名的,就不知道是接口中的哪个实现类,所以 需要重写方法进行说明
    USB  phone = new USB{
        public void start(){
            ...
        }
    };
    //4.创建了接口的匿名实现类的匿名对象
    com.transferData(new USB(){
        public void start(){
            ...
        }  
        });

    final キーワード

    最終変更クラス: このクラスは、String、System、StringBuffer などの他のクラスから継承することはできません

    最終変更メソッド: このメソッドはオーバーライドできなくなりました。たとえば、オブジェクト クラスの getClass() です。

    静的 Final は、プロパティの変更に使用されます。グローバル定数

    最終変更変数 : この時の変数を定数と呼びます

    final updated 属性 : 明示的な初期化、コードブロック内での初期化、コンストラクタ内での初期化の代入箇所を検討できます

    final Modifiedローカル変数: 特に仮パラメータをfinalで変更する場合、仮パラメータが定数であることを示します。このメソッドを呼び出す際には、定数の仮パラメータに実パラメータを代入してください。一度代入すると、仮パラメータはメソッド本体内でのみ使用できます。ただし、再割り当てはできません

    Interface

    インターフェイスは、クラスと並列関係にあるインターフェイスを使用して定義されます

    #インターフェイスとインターフェイスのメンバーの定義:

    インターフェイス関連のルール

    1. インターフェイス内のすべてのメソッドは抽象です。

    2. インターフェイス内のメンバーが明示的に public としてマークされていない場合でも、それらはパブリック アクセス タイプです。

    3. インターフェイス内の変数は、デフォルトで public static Final としてマークされますしたがって、インターフェイス Variables で定義された変数はグローバルな静的定数です。

    4. 新しいインターフェイスを定義し、extends を使用して既存のインターフェイスを継承できます。

    5. クラスを定義し、implements を使用してインターフェイス内のすべてのメソッドを実装できます。

    6. 抽象クラスを定義し、実装を使用してインターフェイスにいくつかのメソッドを実装できます。

    インターフェイスの特性

    1. インターフェイスはインスタンス化できません

    2. 実装クラスはインターフェイスのすべてのメソッドを実装する必要があります

    3. 実装クラスは複数のインターフェイスを実装できます

    4.インターフェイス内の変数はすべて静的定数です

    クラスがインターフェイス内のすべての抽象メソッドをカバーする場合は、インスタンスを作成できます。クラスがサポートする場合は、インスタンスを作成できます。インターフェイス抽象メソッド内のすべての抽象メソッドをカバーしていない場合でも、クラスは依然として抽象クラスです。 Java クラスは複数のインターフェイスを実装できます。単一継承の欠点を補います。

    クラス AA は BB を拡張します。インターフェイスとインターフェイスの間で CC、DD、EE

    を実装します。中間継承は次のとおりです。可能であり、多重継承も可能です。インターフェイスの使用はポリモーフィズムを反映しています。インターフェイスは仕様であり、インターフェイス用のプログラミングです。

    抽象クラスとインターフェイスの類似点と相違点

    同じ点: インスタンス化できませんが、両方とも抽象メソッドを含めることができます

    相違点:

    1. Put抽象クラスとインターフェース(java7,java8)の定義と内部構造の説明

    #2. クラス:単一継承、インターフェース:多重継承。

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

     abstract class Door {
        //开门
        public abstract void openDoor();
        //关门
        public abstract void closeDoor();
    }
     interface Lock {
        public static final int num = 200;
        //开锁
        public abstract void openLock();
        //上锁
        public abstract void closeLock();
    }
    class LockDoor extends Door implements Lock {
        public void openDoor() {
            System.out.println("开门");
        }
        public void closeDoor() {
            System.out.println("关门");
        }
        public void openLock() {
            System.out.println("开锁");
        }
        public void closeLock() {
            System.out.println("上锁");
        }
      }
    public class TestLockDoor {
        public static void main(String[] args) {
            LockDoor lockDoor = new LockDoor();
            lockDoor.openLock();
            lockDoor.openDoor();
            lockDoor.closeDoor();
            lockDoor.closeLock();
        }
    }

    インターフェイスの適用

    2 つの設計モード

    -エージェント モード

    エージェントの設計は次のとおりです。このオブジェクトへのアクセスを制御するための他のオブジェクトのプロキシ

    アプリケーション シナリオ: セキュリティ プロキシ、リモート プロキシ、遅延読み込み

    カテゴリ: 静的プロキシ、動的プロキシ

    - ファクトリ パターン

    作成者と呼び出し者の分離を実現

    interface A{
        int x=0;
    }
    class B{
        int x=1;
    }
    class C extends B implements A{
        public void pX(){
            System.out.println(x);
        }
        public static void main(String[] args){
            new C().pX();
        }
    }
    //问题:编译期不知道是要输出哪个x
    System.out.println(super.x);//这个调用的是父类中的
    System.out.println(A.x);//这个调用的是接口中的

    java8の新しいインターフェース機能

    JDK8: グローバル定数と抽象メソッドに加えて、静的メソッドとデフォルトも定義できます。 Method (デフォルトのキーワード変更)

    public interface CompareA{  
      public static void method1(){
      //静态方法        
      System.out.println("CompareA:北京");   
       }   
        public default void method2(){
        //默认方法        
        System.out.println("CompareA:上海");   
         }
      }

    インターフェイスで定義された静的メソッドは、インターフェイス、interface.method 経由でのみ呼び出すことができます。

    クラスのオブジェクトを実装すると、インターフェイスのデフォルト メソッド object.method を呼び出すことができます。

    実装クラスがインターフェイスのデフォルト メソッドをオーバーライドする場合、呼び出し時にオーバーライドされたメソッドが引き続き呼び出されます。

    サブクラス (または実装クラス) が親クラスと実装された A を継承する場合同じ名前と同じパラメータを持つメソッドがインターフェイスで宣言されています。サブクラスがこのメソッドをオーバーライドしない場合、親クラスのメソッドが呼び出されます——クラス優先度の原則

    如果实现类实现了多个接口,而这个多个接口中定义了同名同参数的默认方法,在实现类没有重写方法的情况下会报”接口冲突“错误,此时需要重写。

    如何在子类(或者实现类)调用父类、接口中被重写的方法? 接口.super.方法。

    内部类

    需要关注的问题:如何实例化成员内部类的对象:外部类Person,静态内部类Brain,非静态内部类Lungs,静态成员内部类:new 外部类.内部类()

    Person.Brain brain=new Person.Brain();

    非静态成员内部类:先造对象,对象.new 内部类()

    Person p=new Person();
    p.Lungs lungs=p.new Lungs();

    如何在成员内部类中区分调用外部类的结构

    形参直接调,所在类的用this.结构,外部类的用外部类.this.结构

    成员内部类和局部内部类在编译以后都会生成字节码文件

    成员内部类:外部类.内部类名.class

    局部内部类:外部类.数字 内部类名.class

    在局部内部类的方法中,如果调用局部内部类所在的方法中的局部变量,该局部变量必须用final关键字修饰(JAVA8之后可以不写出来,但仍然还是final的)

    public void Person(){
        int num=10;
        class AA{//局部内部类
            public void show(){//局部内部类的方法
                num=20;//试图修改会报错
                System.out.println(num);//调用局部内部类所在的方法中的局部变量
            }
        }
    }

    开发中局部内部类的使用

    常用的局部内部类:

    //方式一
    public Comparable getCompareble(){
        class MyComparable implements Comparable{//局部内部类
    
            public int compareTo(Object o){
                return 0;
            }
        }
        return new MyComparable();
    }
    //方式二
    public Comparable getCompareble(){
        return new Comparable(){
    
            public int CompareTo(Object o){
                return 0;
            }
        };
    }

    Java允许将一个类A声明在另一个类B中,A为内部类,B为外部类

    内部类的分类:成员内部类、局部内部类(方法内,代码块内,构造器内)

    成员内部类

    作为外部类的成员:可以调用外部类的结构,可以被static修饰

    作为一个类:可以定义属性、方法、构造器,可以用final、abstract修饰,可以被继承

    this.name//内部类的属性

    Person.this.name//外部类的属性

    以上がJava 抽象クラスとインターフェイスをマスターするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。