継承、インターフェース、ポリモーフィズム、そしてスーパー、これ

1.継承

1つ以上のオブジェクトに共通の特性がある場合、それらの共通の特性をエンティティとして定義し、それらの複数のオブジェクトにそのオブジェクトを継承させることができます。これにより、コードの冗長性を減らすことができます。たとえば、犬と猫は食べることと働くことの共通点を共有しているので、動物のクラスを定義し、動物のクラスに食べて働く方法を持たせ、猫と犬に動物のクラスを継承させることができます。猫と犬の中にいます。食べ方と働き方。猫の食べ方をさらに改善する必要がある場合は、書き直すことができます。猫がまだ泳げる場合は、別の水泳方法を書いてください。

public abstract class Animal {
    abstract void eat();
}
class Dog extends Animal{
    void eat(){
        System.out.println("吃肉");
    }
    public void work(){
        System.out.println("看家");
    }
}
class Cat extends Animal{
    void eat() {
        System.out.println("吃鱼");
    }
    public void work(){
        System.out.println("抓老鼠");
    }
}
public class Test {
    public static void main(String[] args) {
        show(new Cat());
        show(new Dog());
        Animal a=new Cat();
        a.eat();
        Dog d=new Dog();
        d.work();
    }
    public static void show(Animal a) {
        a.eat();
        if (a instanceof Cat) {//注意instanceof
            Cat c = (Cat) a;
            c.work();
        } else if (a instanceof Dog) {
            Dog c = (Dog) a;
            c.work();
        }
    }
}

結果:
魚を食べる、
ネズミを捕まえる、
肉を食べる、
ハウスキーピング、
魚を食べる、
ハウスキーピング

instanceof

使用法:
result = object instanceof class
説明:
objectがclassのインスタンスである場合、instanceof演算子はtrueを返します。オブジェクトが指定されたクラスのインスタンスでない場合、またはオブジェクトがnullの場合、falseを返します。
ただし、Javaのinstanceofのコンパイル済み状態と実行状態には違いがあります。
コンパイル済み状態では、クラスは親クラス、それ自体のクラス、またはオブジェクトオブジェクトのサブクラスになります。これらの3つのケースでは、Javaはエラーなしでコンパイルされます。
実行状態では、クラスはオブジェクトオブジェクトの親クラス、それ自体のクラスにすることができますが、サブクラスにすることはできません。結果の結果は、最初の2つのケースでは真であり、最後のケースでは偽です。ただし、クラスがサブクラスの場合、コンパイルではエラーは報告されません。実行の結果はfalseです。

2.インターフェース

インターフェイスはクラスではありません。インターフェイスの記述方法はクラスと非常に似ていますが、異なる概念に属しています。クラスは、オブジェクトのプロパティとメソッドを記述します。インターフェイスには、クラスによって実装されるメソッドが含まれています。
インターフェイスを実装するクラスが抽象クラスでない限り、クラスはインターフェイス内のすべてのメソッドを定義します。
インターフェイスをインスタンス化することはできませんが、実装することはできます。インターフェイスを実装するクラスは、インターフェイスで説明されているすべてのメソッドを実装する必要があります。そうでない場合は、抽象クラスとして宣言する必要があります。さらに、Javaでは、インターフェース型を使用して変数を宣言したり、nullポインターにすることも、このインターフェースによって実装されたオブジェクトにバインドしたりすることができます。

public class MammalInt implements Animal{
 
   public void eat(){
      System.out.println("Mammal eats");
   }
 
   public void travel(){
      System.out.println("Mammal travels");
   } 
 
   public int noOfLegs(){
      return 0;
   }
 
   public static void main(String args[]){
      MammalInt m = new MammalInt();
      m.eat();
      m.travel();
   }
}

3.ポリモーフィズム

ポリモーフィズムの利点

  • タイプ間の結合関係を排除します(結合関係とは、2つのものの間に相互作用と相互影響関係がある場合、この関係は「結合関係」と呼ばれることを意味します)。
  • 交換可能性
  • スケーラビリティ
  • インターフェース
  • 柔軟性
  • シンプルさ####ポリモーフィズムの利点

多型が存在するために必要な3つの条件

  • 継承する
  • リライト
  • 親クラス参照は子クラスオブジェクトを指します
public class Test {
    public static void main(String[] args) {
      show(new Cat());  // 以 Cat 对象调用 show 方法
      show(new Dog());  // 以 Dog 对象调用 show 方法
                
      Animal a = new Cat();  // 向上转型  
      a.eat();               // 调用的是 Cat 的 eat
      Cat c = (Cat)a;        // 向下转型  
      c.work();        // 调用的是 Cat 的 work
  }  
            
    public static void show(Animal a)  {
      a.eat();  
        // 类型判断
        if (a instanceof Cat)  {  // 猫做的事情 
            Cat c = (Cat)a;  
            c.work();  
        } else if (a instanceof Dog) { // 狗做的事情 
            Dog c = (Dog)a;  
            c.work();  
        }  
    }  
}
 
abstract class Animal {  
    abstract void eat();  
}  
  
class Cat extends Animal {  
    public void eat() {  
        System.out.println("吃鱼");  
    }  
    public void work() {  
        System.out.println("抓老鼠");  
    }  
}  
  
class Dog extends Animal {  
    public void eat() {  
        System.out.println("吃骨头");  
    }  
    public void work() {  
        System.out.println("看家");  
    }  
}

結果:
魚を食べる、
ネズミを捕まえる、
骨を食べる、
ハウスキーピング、
魚を食べる、
ネズミを捕まえる

スーパーの使い方

1.通常の直接引用

superは親クラスのプロパティを参照できます(ただし、superが現在のオブジェクトの親クラスを指しているとは言えません。厳密ではありません)。

2.サブクラスのメンバー変数またはメソッドは、親クラスのメンバー変数またはメソッドと同じ名前です。

class Animal {
    public int a=10;
    void print(){
        System.out.println("I'm Animal");
    }
}

class Dog extends Animal{
    void print(){
        super.print();
        System.out.println("I'm Dog");
        System.out.println(super.a);
    }
}
public class Test {
    public static void main(String[] args) {
        Animal dog=new Dog();
        dog.print();
    }
}

結果:
私は動物
です私は犬です
10

3.参照コンストラクター

  • super(パラメーター):親クラスのコンストラクターを呼び出します(コンストラクターの最初のステートメントである必要があります)。

  • this(パラメーター):このクラスで別の形式のコンストラクターを呼び出します(コンストラクターの最初のステートメントである必要があります)。

package com.company.animal;

class Animal {
    public static void prt(String s) {
        System.out.println(s);
    }
    Animal(){
        prt("父类无参构造方法");
    }
    Animal(String name){
        prt("父类有参构造方法"+name);
    }
}

class Dog extends Animal{
    Dog(){
        super();
        prt("子类无参构造方法");
    }
    Dog(String name){
        super(name);
        prt("子类有参构造方法"+name);
    }
    Dog(String name,int age){
        this(name);
        prt("子类相同形参的构造函数"+age);
    }
}
public class Test {
    public static void main(String[] args) {
        Animal dog=new Dog();
        dog=new Dog("晨光");
        dog=new Dog("狗晨光",1);
    }
}

結果:
親クラスにはパラメーター構築メソッド
がありません子クラスにはパラメーター構築メソッドがありません
親クラスにはパラメーター構築メソッドChenguang
があります子クラスにはパラメーター構築メソッドChenguang
があります親クラスにはパラメーター構築メソッドがありますGouChenguang
子クラスにはパラメーター構築メソッドがあります同じパラメーターを持つパラメーター構築メソッドGouChenguang
クラスコンストラクター1
この例からわかるように、superとthisを使用して、スーパークラスのコンストラクターとこのクラスの他の形式のコンストラクターをそれぞれ呼び出すことができます。

4.これを使用する方法

  • 通常の直接参照
  • フォーム参加メンバーは同じ名前です。これを使用して区別します
  • 参照コンストラクター

スーパーとこれの類似点と相違点

  • super(パラメーター):基本クラスのコンストラクターを呼び出します(コンストラクターの最初のステートメントである必要があります)
  • this(パラメーター):このクラスで別の形成されたコンストラクターを呼び出します(コンストラクターの最初のステートメントである必要があります)
  • super:現在のオブジェクトの直接の親クラスのメンバーを参照します(基本クラスと派生クラスのメンバー定義が同じ場合、直接の親クラスに隠されている親クラスのメンバーデータまたは関数にアクセスするために使用されます) 、例:super .variable name
    super .member function data name(argument)
  • これ:現在のオブジェクト名を表します(プログラムであいまいさが発生する可能性がある場合、これは現在のオブジェクトを示すために使用する必要があります。関数の正式な参加クラスがメンバーデータと同じ名前である場合、
    これを使用してメンバー変数名を示します)
  • super()の呼び出しは、サブクラスコンストラクターの最初の行に記述する必要があります。そうしないと、コンパイルが失敗します。各サブクラスコンストラクターの最初のステートメントは暗黙的に
    super()を呼び出します。親クラスにこの形式のコンストラクターがない場合、コンパイル中にエラーが報告されます。
  • super()はthis()に似ていますが、違いは、super()がサブクラスからスーパークラスのコンストラクターを呼び出し、this()が同じクラスの他のメソッドを呼び出すことです。
  • super()とthis()の両方を、コンストラクターの最初の行に配置する必要があります。
  • これで1つのコンストラクターを呼び出すことはできますが、2つを呼び出すことはできません。
  • これとsuperは、必然的に他のコンストラクターを呼び出すため、コンストラクターに同時に表示することはできません。また、他のコンストラクターにもsuperステートメントが含まれるため、同じステートメントが同じコンストラクターにある場合、そのステートメントは失われます。ステートメント、コンパイラは合格しません。
  • this()とsuper()はどちらもオブジェクトを参照するため、静的環境ではどちらも使用できません。含む:静的変数、静的
    メソッド、静的ステートメントブロック。
  • 基本的に、これはこのオブジェクトへのポインタですが、superはJavaキーワードです。

[1] http://www.runoob.com/

おすすめ

転載: blog.csdn.net/MCYZSF/article/details/88960128