ホームページ  >  記事  >  Java  >  Java ポリモーフィズムと抽象クラスの用途と原則は何ですか

Java ポリモーフィズムと抽象クラスの用途と原則は何ですか

王林
王林転載
2023-04-28 21:01:05926ブラウズ

私たちは Java の 3 つの主要な機能、カプセル化、継承、ポリモーフィズムを知っています。最初の 2 つは Java 入門 (6) で説明しましたが、ここではポリモーフィズムの機能について説明します。

ポリモーフィズムとは何ですか?

ポリモーフィズムは、その名前が示すように、複数の形式を意味します

Java におけるポリモーフィズムの意味:

  • オブジェクトにメッセージを送信します。オブジェクトは、このメッセージに応じてどの動作を採用するかを独自に決定します

  • #サブクラス オブジェクトの参照が親クラスの参照変数に割り当てられ、動的メソッド呼び出しが実装されます

Java におけるポリモーフィズムの前提条件:

  • 継承

  • 親クラス メソッドのオーバーライド

  • 上方変換

ポリモーフィズムについての私の説明:

たとえば、私たちは人間、学生、若者です。私は人間として物事を行うことができます。 、学生としてのアイデンティティを使用して学生チケットを購入したり、若者としてのアイデンティティを使用して慈善活動を行ったりすることもできるため、さまざまな形でさまざまなことを行うことができます。これはよく理解できたでしょうか?

注:

ポリモーフィズムの前提条件: 子と親のクラス関係が存在する必要があります。

多態性の親クラス参照変数を使用してメソッドを呼び出すと、サブクラスのオーバーライドされたメソッドが呼び出されます。

ポリモーフィズムの定義と使用形式:

親クラス型変数名 = new サブクラス型 ();

ポリモーフィズムにおけるメンバーの特徴:

  • 多態性メンバー変数: コンパイルおよび実行時に左側を確認します

  • 多態性メンバー メソッド: コンパイル時は左側を、実行時は右側を確認します

ポリモーフィック変換:

  • ポリモーフィック変換は、上向き変換と下向き変換の 2 種類に分けられます

  • 上向き変換: 複数状態自体は上方変換のプロセスです

  • 使用形式: 親クラスの型変数名=新しいサブクラスの型();

  • 適用可能なシナリオ: サブクラスの型に直面する必要がない場合、拡張性を向上させるか、親クラスの機能を使用することで、対応する操作を完了できます。

  • 下方変換: 上方変換されたサブクラス オブジェクトは、強制型変換の形式を使用して、親クラス参照型をサブクラス参照型に変換できます

  • 使用形式: サブクラス型変数名 = (サブクラス型) 親クラス型変数;

    ##適用シナリオ: サブクラス独自の機能を使用したい場合。
  • コードの説明:
  • public class Person {     //人类,作为父类使用
        public void speak(){
            System.out.println("我们都是一个人");
        }
    }
    
    
    
    public class Student extends Person{    //继承父类,相当于我们是学生,有人的方法
        @Override
        public void speak(){
            System.out.println("我是人类中的学生");
        }
    }
    
    
    
    public class Child extends Person{   //继承父类,相当于我们是孩子,有孩子的行为
        @Override
        public void speak(){
    
            System.out.println("我是人类中的孩子");
        }
    }
    
    
    
    
    //测试类
    public class TestMain {
        public static void main(String[] args) {
    
    		//父类类型 变量名=new 子类类型();
            Person p = new Student();   //子类对象的引用赋值给父类 
            p.speak(); //多态 相当于这里使用的是Student的方法。输出我是人类中的学生
            //我作为人,我用学生的身份,说出:我是人类中的学生
    
    
    		Person p = new Child(); 
    		p.speak();  //输出:我是人类中的孩子
    		//我作为人,用孩子的身份,说出我是人类中的孩子
    
        }
    }
    
    //这段代码,我们用到了 继承,重写,向上转型,因为多态本来就是向上转型的过程
ポリモーフィズムの役割:

ポリモーフィズムを導入した後、ポリモーフィズムは何に役立つのでしょうか?ポリモーフィズムが Java の 3 つの主要な機能とみなされる理由。理由があるはずです:

#コードの再利用性を向上させる

  • モジュール間の結合を減らす

  • #ここでポリモーフィック機構とは何なのかを紹介したいと思います。 Java 言語はポリモーフィズムをどのように実装するのでしょうか? (少しわかりにくいかもしれませんし、内容もよく分かりませんが、これも面接の質問です)

    いわゆるポリモーフィズムとは、参照変数が指す特定の型を指します。プログラム内で定義されている変数と、参照が指す特定の型 変数によって発行されるメソッド呼び出しは、プログラミング中には決定されませんが、プログラムの実行中に決定されます。つまり、参照変数がどのクラス インスタンス オブジェクトを指すか、参照変数によって発行されるメソッド呼び出しは、どのクラスに実装されたメソッドであるか、プログラム実行中に決定する必要があります。特定のクラスはプログラムの実行時にのみ決定されるため、ソース プログラム コードを変更せずに参照変数をさまざまなクラス実装にバインドでき、参照によって呼び出される特定のメソッドがそれに応じて変更されます。つまり、参照変数は変更する必要がありません。プログラム コードは、実行中にプログラムにバインドされた特定のコードを変更し、プログラムが複数の実行状態を選択できるようにすることができます。これがポリモーフィズムです。ポリモーフィズムは、コンパイル時ポリモーフィズムと実行時ポリモーフィズムに分けられます。このうち、編集時のポリモーフィズムは静的であり、主にメソッドのオーバーロードを指します。異なるパラメーター リストに基づいて異なる関数を区別します。編集後は 2 つの異なる関数になります。実行時にはポリモーフィズムはありません。実行時のポリモーフィズムは動的であり、動的バインディングによって実現されます。これをポリモーフィズムと呼びます。
ポリモーフィズムを理解するには、次のコードを参照することもできます。

class People{     //父类
    public void eat(){
        System.out.println("我们会吃饭");
    }
}


class Student extends People{  //继承父类
    @Override
    public void eat(){
        System.out.println("我会吃肉");
    }
    public void study(){
        System.out.println("我们要好好学习");
    }
}


class Teacher extends People{     //继承父类
    @Override
    public void eat(){
        System.out.println("老师会吃蔬菜");
    }
    public void teach(){
        System.out.println("老师要认真上课");
    }
}

//测试类:
public class TestMain {
    public static void main(String[] args) {
        People p=new Stu();      //子类对象的引用赋值给父类 
        p.eat();       //输出: 我会吃肉
    }
}

抽象クラス:

抽象クラスとは何ですか?

共通クラスは、インスタンス化されたオブジェクトを直接生成できる完全な関数クラスであり、コンストラクター、共通メソッド、静的メソッド、定数、変数などを共通クラスに含めることができます。抽象クラスは、通常のクラスの構造に抽象メソッドを追加するコンポーネントを指します。

抽象メソッド:

すべての通常のメソッドの上に「{}」があり、メソッド本体を表します。メソッド本体を持つメソッドは、オブジェクトによって直接使用される必要があります。抽象メソッドはメソッド本体のないメソッドを指し、抽象メソッドもキーワード abstract で変更する必要があります。つまり、抽象クラス内の抽象メソッドを記述し、継承後に書き直す必要がありません。

抽象クラス宣言キーワード: abstracat

抽象クラスの定義:

public abstract class studnet{//定义一个抽象类
	
	public void study(){                         //普通方法
		System.out.println("我会学习");
	}
	
	public abstract void eat();         //抽象方法,没有方法体,有abstract关键字做修饰
	
}

//注意: 有抽象方法,这个类必须是抽象的!!!

例の説明:

面積を計算するには形状クラス Shape を提供する必要があります。と sum Perimeter メソッドを使いますが、形状自体が決まっていない場合、周囲長と面積の計算方法が決まりませんので、このときは抽象クラスと抽象メソッドを使用する必要があります。

由于Shape类计算周长和面积的方法无法确定,那么就可以将这样的方法声明为抽象的,以便在具体的子类中进行实现。

//定义一个shape类,但是没有具体的形状,所以我们定义成抽象类
public abstract class Shape {
    
    private int a;
    public abstract void area(){}     //求面积的方法
    public abstract void perimeter();   //求周长的方法

    public Shape() {    //无参构造
    }

    public Shape(int a) {
        this.a = a;
    }
}
//计算圆形面积的子类

public  abstract class shape {    //有抽象方法的类,则一定是抽象类,需要关键字abstract修饰

        private int a;
        public abstract void area();     //求面积的方法,没有方法体的方法,需要关键字abstract修饰
        public abstract void perimeter();   //求周长的方法
}


//创建计算圆面积和周长的子类,并继承抽象类shape,并重写shape内的方法
public class Circle extends shape{

    public static double pi = 3.14;
    private double r;  //半径


    @Override
    public void area() {
        System.out.println("圆的面积:"+Circle.pi*this.r*this.r);
    }

    @Override
    public void perimeter() {
        System.out.println("圆的周长为:"+2*Circle.pi*this.r);
    }

    public Circle() {
    }

    public Circle(double r) {  //
        this.r = r;
    }

}


//测试类:
public class TestMain {
    public static void main(String[] args) {
        Circle c = new Circle(5);        //传入半径为:5
        c.area();
        c.perimeter();

    }

}

//输出结果: 圆的面积:78.5
// 圆的周长为:31.400000000000002

抽象方法和抽象类的注意事项:

  • 抽象类中是可以有构造函数的,并且构造函数的写法和其它类没有区别,只不过它真正跑起来是因为子类构造函数的super调用,毕竟我们没办法new一个抽象类对象出来,只能把抽象类的构造函数交给子类的构造函数去使用。

  • 抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类。

  • 抽象类的子类,必须重写父类中所有的抽象方法,如果有一个抽象方法没有重写,都会出现编译错误不给过,这时也可以把子类也声明为抽象类,报错就会消失。

以上がJava ポリモーフィズムと抽象クラスの用途と原則は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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