JAVA 注 5: 継承

1. 継承

継承: 既存のクラスに基づいて新しいクラスを作成し、既存のクラスのメソッドを再利用 (継承) し、いくつかの新しいフィールドとメソッドを追加します。

既存のクラスは、スーパークラス、基本クラス、親クラスと呼ばれます。

新しいクラスは次のとおりです: サブクラス、派生クラス、子クラス

1.継承(拡張):

Java では、すべての継承はパブリック継承です。キーワード extend を使用して、親クラスのすべてのパブリック メソッドとパブリック フィールドを継承します。

public クラス Manger は Employee を拡張します

{

        メソッドとフィールドを追加する

}

//サブクラスは、extends キーワードを通じて親クラス Employee のすべてのメソッドを継承します。

2. オーバーライド

サブクラスで定義したメソッド名が親クラスのメソッドと同じ名前の場合、親クラスのメソッドが上書きされます。

オーバーライドとは、サブクラスのメソッドをオーバーライドすることです。

例: Manger.java。Manger クラスは Employee クラスを継承し、getBonus()、setBonus()、getInfo() およびその他のメソッドを使用するプライベート ボーナス フィールドを定義します。

package cn.edu.abc.corejava;
public class Manger extends Employee
{
    private double bonus;
    public Manger(String N, double S, int Year, int month, int day)
    {
        super(N, S, Year, month, day);
    }
    public double getBonus()
    {
        return this.bonus;
    }
    public void setBonus(double bonus)
    {
        this.bonus = bonus;
    }
    public static String getInfo(Manger A[])
    {
        String info="";
        for (Manger e:A)
            info +=e.getName()+"\t"+e.getBonus()+"\n";
        return info;
    }
    public String getName()
    {
        return "管理员:  "+super.getName();
    }
    public static void main(String args[])
    {
        Manger[] boss = new Manger[2];
        boss[0] = new Manger("张某",6000,1999,1,2);
        boss[1] = new Manger("李某",6000,1999,1,2);
        boss[0].setBonus(1000);
        boss[1].setBonus(2000);
        System.out.println(getInfo(boss));
        System.out.println(boss[1].getName());
    }
}

知らせ:

1. 継承はパブリック継承であり、フィールド、メソッドの追加、またはメソッドのオーバーライドが可能であり、継承によってフィールドやメソッドが削除されることはありません。

2. super. 親クラス メソッドを使用して、次の形式で親クラス メソッドを呼び出すことができます。

 public String getName()
    {         return "管理者: "+super.getName();     }

// Manger サブクラスで getName メソッドを定義し、継承された親クラス Employee の getName メソッドをオーバーライドします。

//super.getName() このステートメントは、親クラス Employee の getName メソッドを呼び出します。

    public static String getInfo(Manger A[])
    {         String info="";         for (マネージャー e:A)             info +=e.getName()+"\t"+e.getBonus()+"\n";         情報を返す。     }




//e.getName() はサブクラスのメソッドです

        従業員 A = new Employee("従業員 1",1211,1998,11,1);
        System.out.println(A.getName());
        マネージャー B = new Manger("マネージャー 1",123,1322,89 , 88);
        System.out.println(B.getName());

        // オーバーライドとはサブクラスのメソッドを書き換えるだけです。A.getName() は依然として親クラス Employee のメソッドを呼び出します。

 3. サブクラスコンストラクター

Manger クラスのコンストラクターは Employee のプライベート フィールドにアクセスできないため、これらすべてのプライベート フィールドは、スーパー構文でコンストラクターを呼び出して初期化する必要があります。super() ステートメントは、サブクラス コンストラクターの最初のステートメントである必要があります。

public class Manger extends Employee
{     private doubleボーナス;     public Manger(String N, double S, int Year, int month, int day)     {         super(N, S, Year, month, day);     }




……

}

キーワード this には 2 つの意味があります。1 つは暗黙のパラメーターへの参照を示すこと、もう 1 つはクラスの他のコンストラクターを呼び出すことです。

同様に、キーワード super には 2 つの意味があります。1 つはスーパークラスのメソッドを呼び出すこと、もう 1 つはスーパークラスのコンストラクターを呼び出すことです。

 4. オブジェクトクラス

Object クラスはすべてのクラスの親クラスです。Java の最上位クラスです。各クラスは Object を拡張します。親クラスが明確に指定されていない場合、Object はこのクラスの親クラスとみなされます。すべてのクラスは Object のサブクラスであり、どのクラスでも Object クラスのメソッドをオーバーライドできます。

<重要なポイント>:

        1. オブジェクト型変数は、あらゆる種類のオブジェクトを参照するために使用できます。

オブジェクト obj = new Employee("管理者",1234,...);

        2. オブジェクト型の変数は、さまざまな値の汎用コンテナとしてのみ使用できます。変数に対して特定の操作を実行するには、元の型を知り、必須の変換を実行する必要があります。

従業員 e = (従業員)obj;

        3. Java では、基本型 (数値、文字、ブール値) のみがオブジェクトではなく、すべての配列型がオブジェクトです。

<メソッド>:

        1. イコールメソッド

"= 演算子は 2 つのオブジェクトの参照アドレスが等しいかどうかを比較し、equals メソッドは 2 つのオブジェクトの実際の内容を比較します。

5. 必須の型変換 

キーワードのアップキャスト、ダウンキャスト、instanceof

上方変換: 親クラスを使用してサブクラスを記述し、具象クラスを抽象クラスに変換し、継承されたパブリック メソッドを呼び出し、書き換えられていないメソッドを書き換えずに呼び出し、書き換えられた場合は書き換えられたメソッドを呼び出します。

従業員テスト = new Manger("abc",12,12,1,1);

形式: 親クラスの型 親クラスのオブジェクト = 新しいサブクラスの型 (つまり、コンストラクター)

例 1. テスト呼び出し getName()

これは、継承されたパブリック メソッドを呼び出し、書き換えられていないパブリック メソッドを呼び出し、書き換えられていない場合は書き換えられたパブリック メソッドを呼び出すことで取得でき ます。

下方変換: 親クラスがサブクラスに変換され、抽象クラスが具象クラスに変換されます。たとえば、従業員はマネージャーです。

抽象クラスのオブジェクトを具象クラスのオブジェクトに変換することは通常間違っています。相互に変換できるかどうかを判断するには、instanceof キーワードを使用します。

ダウンキャスト:

        従業員テスト = new Manger("abc",12,12,1,1);

        Manger subTest = (Manger) テスト;

        前提: 親クラス オブジェクトは最初にサブクラス オブジェクトを参照する必要があります

        文法形式: サブクラス型 サブクラス オブジェクト = (サブクラス型) 親クラス オブジェクト

インスタンスのキーワード:

        文法形式 myobjectinstanceofExampleClass

 例 2. subTest はサブクラス固有のメソッド setBonus() および getBonus() を呼び出します

Employee Test = new Manger("abc",12,12,1,1);//父类对象引用子类对象
if (Test instanceof Manger)//判断Test是否属于Manger类对象
        {
            Manger subTest = (Manger) Test;//向下转换
            subTest.setBonus(1000);
            System.out.println(subTest.getName()+" "+subTest.getBonus());
        }else
        {
            System.out.println("转换失败");
        }

                                                                                                            

6. 継承の防止: Final キーワード

Final キーワードによって変更された内容は変更できません。変更不可、オーバーライド不可、継承不可と省略されます。

最終フィールド: 定義時に初期値を割り当てる必要があり、使用後に変更することはできません

Final メソッド: メソッドを Final 型として定義すると、サブクラスが親クラスの定義と実装を変更するのを防ぐことができます。この場合、private 修飾子はそのメソッドを暗黙的に Final として指定し、当然その親クラスのメソッドをオーバーライドすることはできません。

最終クラス: 拡張が許可されていないクラスを最終クラスと呼びます。Final として定義されたクラスは継承できず、このクラスに対する変更は許可されません。このクラスがfinalの場合、このクラスのメソッドは暗黙的にfinalに設定されますが、そのフィールドはfinalまたはnon-finalに設定できます。

文法形式: public Final class...

7. ポリモーフィズム

1 つのオブジェクト変数が複数の実際の型を示すことができる現象は、ポリモーフィズムと呼ばれます。ポリモーフィズムは同じインターフェイスであり、異なるインスタンスを使用して異なる操作を実行します。また、同じイベントが異なるオブジェクトで発生すると、異なる結果が生じることも理解できます。

例: Student クラスが Person クラスを継承し、Student クラスのオブジェクトが Tom として定義されている場合、Tom は person クラスであると同時に Student クラスでもあります。

親クラスが出現する場合はどこでも、それをサブクラスに置き換えることができます。

ポリモーフィズムが存在するために必要な 3 つの条件:

        1. 継承

        2.書き換える

        3. スーパークラスはサブクラスのオブジェクトを参照します

ポリモーフィズムを利用したメソッドを呼び出す場合は、親クラスにメソッドが存在するかどうかを確認し、存在しない場合はコンパイルエラーとなり、存在する場合はサブクラスにある同名のメソッドを呼び出します。

例 1. ポリモーフィズムの実施形態 Polymorphism.java

package cn.edu.abc.corejava;

public class Polymorphism {
    public static void main(String args[]) {
        get_class(new Student());
        get_class(new Teacher());
    }

    public static void get_class(Person X) 
    {
       X.work();
    }

}

class Person
{
    public void work(){}
}
class Student extends Person
{
    public void eat()
    {
        System.out.println("吃饭");
    }
    public void work()
    {
        System.out.println("Student work :学习");
    }
}
class Teacher extends Person
{
    public void work()
    {
        System.out.println("Teacher work :上课");
    }
}

  

Person クラスには Student と Teacher の 2 つのサブクラスがあり、どちらも親クラスの work メソッドを書き換えます。 work() は同じもので、同じ work メソッドは Student クラスでは「学習」として表現されますが、Student クラスでは「学習」として表現されます。 Teacher クラス「Take a class」では「学習」として表されます。これは、同じイベントが異なるオブジェクトで発生すると異なる結果が生成されること、つまりポリモーフィズムを反映しています。

8. 抽象クラス

abstract キーワードを使用して定義されたクラスを抽象クラス、このキーワードを使用して定義されたメソッドを抽象メソッドと呼びます。抽象クラスには具体的なメソッド本体がなくオーバーライドされない限りメソッド自体は意味を持ちません実際、抽象クラスは継承されること以外に意味を持ちません。

クラスに抽象メソッドが含まれる場合は、そのクラスを抽象としてマークする必要があります。

一般クラスで十分ではないのに、なぜ抽象クラスを設定するのでしょうか? 一般クラスで定義されたメソッドはサブクラスによってオーバーライドすることもできるため、それらを抽象として定義する必要はありません。

        実際のところ、抽象クラスが便利であるとは言えません。一般クラスでも確かにアプリケーションを満たすことができますが、実際には、各サブクラスのメソッドが必要になるため、親クラスには記述する必要のないメソッドがいくつか存在します。絶対に違うので親クラスに書く必要はなく、クラスに書きます。もちろん、抽象クラスを非抽象クラスとして記述することもできますが、これは必須ではありません。

 その抽象クラスは継承のみが可能で、インスタンス化はできません。つまり、対応するインスタンスを作成することはできません。抽象クラスには非抽象メソッドと抽象メソッドを含めることができますが、抽象メソッドがある場合、クラスは抽象クラスとしてのみ設定できます。

 抽象クラスとして記述されているため、他の人があなたのコードを見たとき、またはあなたが他の人のコードを見たときに、抽象メソッドに注目し、このメソッドがサブクラスに実装されていることがわかるようにするための注意事項があります。

9. インターフェース

インターフェイスは抽象メソッドのコレクションです。インターフェイス内のすべてのメソッドにはメソッド本体がありません。インターフェイスは単なるフォームであり、インターフェイス自体は何もできません。インターフェイス修飾子は public であり、他の修飾子は使用できません。インターフェイスで定義されているフィールドはすべて static および Final です

文法形式:

        publicinterfacePaintable { //インターフェイスメソッドの定義では public abstract キーワードを省略できます

                void age();

                }

クラスは親クラスを継承し、同時にインターフェイスを実装します。

文法形式:

        パブリック クラス 平行四辺形 (サブクラス) extends Quadrangle (スーパークラス) Paintaleを実装する{

        ……

        }

1. クラスは複数のインターフェイスを継承できます。 class クラス名 実装インターフェイス 1. インターフェイス...

2. インターフェイスは別のインターフェイスを継承できます。インターフェイス intf1 extends intf2

インターフェースを継承するサブクラスは、インターフェースのメソッドをクラスに実装する必要があることに注意してくださいインターフェイスはインスタンス化できませんが、実装することはできますインターフェイスを実装するクラスは、インターフェイスに記述されているすべてのメソッドを実装する必要があります。それ以外の場合は、抽象クラス(Abstract Class) として宣言する必要があります。例えば 

 定義インターフェースのメソッドは public abstract キーワードを省略できます

/*説明*/

Age インターフェイスを定義し、インターフェイス メソッド age() を定義します。

(インターフェースを実装するクラス) サブクラス Student と Teacher はスーパークラス person とインターフェース Age を継承します このとき、サブクラスはインターフェースにメソッドを実装するか、サブクラスのメソッドを抽象クラスとして設定する必要があります

/* インターフェースの理解 */

インターフェースは看板に似ており、「麺の製造工程」(インターフェースA)など、「セクション」の方法を定義します。サブクラスがインターフェースAを継承する場合、このインターフェースのメソッドを実装する必要があります。つまり、「セクション」のメソッドも実装する必要があります(「麺を作るプロセス」を継承したい場合は、 「セクション」も学習します)。このサブクラスはインターフェースを継承せずに「セクション」メソッドを実装できますが、たとえば、レストランクラスは独自に「セクション」メソッドを定義することもできますが、明らかに明白ではありません。インターフェースほど明確ではなく、コード量も増えます。

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

おすすめ

転載: blog.csdn.net/m0_61598337/article/details/128273372