ホームページ >Java >&#&チュートリアル >Java オブジェクト指向ポリモーフィズムを 1 つの記事でマスターする
この記事では、java に関する関連知識を提供します。主にポリモーフィズムに関する関連問題を紹介します。ポリモーフィズムはオブジェクト指向プログラミングの重要な機能であり、同じエンティティを指します。同時に複数のフォームを持つオブジェクトの複数の形式を指します。一緒に見てみましょう。皆様のお役に立てれば幸いです。
推奨学習: 「java ビデオ チュートリアル 」
ポリモーフィズムはオブジェクト指向ですプログラム デザイン (OOP) の重要な特徴は、同じエンティティが同時に複数の形式を持つことです。つまり、同じオブジェクトが異なる時点で異なるオブジェクトを表し、オブジェクトの複数の形式を指します。
さまざまなサブクラス オブジェクトを親クラスとして扱うことができるため、さまざまなサブクラス オブジェクト間の差異を保護し、共通のコードを記述し、共通のプログラミングを作成し、呼び出し標準を統一できます。
#たとえば、あなたのガールフレンドがあなたに果物を買ってほしいと頼みました。あなたが何を買うかがリンゴであろうとスイカであろうと、それが果物である限り、これは人生における多態性の現れです。別の例として、子猫、子犬、子豚を小動物に分類できます。各小動物には食事が必要なので、一律に「必ず食べなければならない」と設定できますが、各小動物の習性は異なるため、これは次のようになります。小動物独自の関数を設定可能 ポリモーフィックオブジェクトは親クラスで定義されたサブクラスでオーバーライドされた関数のみを呼び出すことができ、サブクラス独自の関数を呼び出すことはできない これによりコードの統一化を実現 2. 特性 クラスの作成: TestDemo.java
package cn.tedu.oop2;/*本类用作多态的入门案例*/public class TestDemo { public static void main(String[] args) { //6.创建“纯纯的”对象用于测试 Animal a = new Animal(); Cat c = new Cat(); Dog d = new Dog(); a.eat();//小动物Animal吃啥都行~调用的是父类自己的功能 c.eat();//小猫爱吃小鱼干~调用的是子类重写后的功能 d.eat();//小狗爱吃肉骨头~调用的是子类重写后的功能 /*2.父类对象不可以使用子类的特有功能*/ //a.jump();//报错,Animal类里并没有这个方法 //a.run();//报错,Animal类里并没有这个方法 c.jump();//小猫Cat跳的老高啦~,子类可以调用自己的功能 d.run();//小狗Dog跑的老快啦~,子类可以调用自己的功能 //7.创建多态对象进行测试 /*3.口诀1:父类引用指向子类对象 * 解释:创建出来的子类对象的地址值,交给父类类型的引用类型变量来保存*/ Animal a2 = new Cat();//Cat类对象的地址值交给父类型变量a2来保存 Animal a3 = new Dog();//Dog类对象的地址值交给父类型变量a3来保存 //8.测试多态对象 /*4.口诀2:编译看左边,运行看右边 * 解释:必须要在父类定义这个方法,才能通过编译,把多态对象看作是父类类型 * 必须要在子类重写这个方法,才能满足多态,实际干活的是子类*/ a2.eat();//小猫爱吃小鱼干~,多态对象使用的是父类的定义,子类的方法体 }}/*1.多态的前提:继承+重写*///1.创建父类class Animal{ //3.创建父类的普通方法 public void eat(){ System.out.println("小动物Animal吃啥都行~"); }}//2.1创建子类1class Cat extends Animal{ //4.1添加重写的方法 public void eat(){ System.out.println("小猫爱吃小鱼干~"); } //5.1添加子类的特有功能 public void jump(){ System.out.println("小猫Cat跳的老高啦~"); }}//2.2创建子类2class Dog extends Animal{ //4.2添加重写的方法 @Override public void eat(){ System.out.println("小狗爱吃肉骨头~"); } //5.2添加子类的特有功能 public void run(){ System.out.println("小狗Dog跑的老快啦~"); }}4. ポリモーフィズムの利点
クラスの作成: TestDemo2.java
package cn.tedu.oop2;/*本类用于测试多态成员的使用情况*/public class TestDemo2 { public static void main(String[] args) { //7.创建纯纯的子类对象 Dog2 d = new Dog2(); System.out.println(d.sum);//20,子类自己的属性 d.eat();//小狗爱吃肉包子,子类自己的方法 //8.创建多态对象 /*口诀1:父类引用指向子类对象*/ /*口诀2:编译(保存)看左边,运行(效果)看右边*/ Animal2 a = new Dog2(); /*多态中,成员变量使用的是父类的*/ System.out.println(a.sum);//10 /*多态中,方法的声明使用的是父类的,方法体使用的是子类的*/ a.eat();//小狗爱吃肉包子 /*多态中,调用的静态方法是父类的,因为多态对象把自己看作是父类类型 * 直接使用父类中的静态资源*/ a.play();//没有提示,玩啥都行~ Animal2.play(); }}//1.创建父类class Animal2{ //3.创建父类的成员变量 int sum = 10; //4.创建父类的普通方法 public void eat(){ System.out.println("吃啥都行~"); } //9.1定义父类的静态方法play public static void play(){ System.out.println("玩啥都行~"); }}//2.创建子类class Dog2 extends Animal2{ //5.定义子类的成员变量 int sum = 20; //6.重写父类的方法 @Override public void eat(){ System.out.println("小狗爱吃肉包子"); } //9.2创建子类的静态方法play //@Override /*这不是一个重写的方法,只是恰巧在两个类中出现了一模一样的两个静态方法 * 静态方法属于类资源,只有一份,不存在重写的现象 * 在哪个类里定义,就作为哪个类的资源使用*/ public static void play(){ System.out.println("小狗喜欢玩皮球~"); }}7 拡張機能
クラスの作成: DesignCar.java
package cn.tedu.oop2;/*本类用于完成汽车设计案例*/public class DesignCar { public static void main(String[] args) { //9.创建一个纯纯的父类对象进行测试 Car c = new Car(); System.out.println(c.getColor());//null c.start(); c.stop(); //c.swim();//报错,父类对象不可以调用子类的特有功能 //10.创建纯纯的子类对象做测试 BMW b = new BMW(); System.out.println(b.color);//五彩斑斓的黑 System.out.println(b.getColor());//null b.start();//都让开,我的车要起飞啦~ b.stop();//唉呀妈呀熄火了~ //11.创建多态对象进行测试 Car c2 = new TSL(); //System.out.println(c2.color); System.out.println(c2.getColor()); c2.stop(); c2.start(); //c2.swim(); }}//1.通过分析,抽象形成一个汽车类class Car{ //2.定义并封装汽车类的属性--成员变量 private String brand;//品牌 private String color;//颜色 private int id;//编号 private double price;//价格 //3.定义功能 public void start(){ System.out.println("我的小车车启动啦~"); } public void stop(){ System.out.println("唉呀妈呀熄火了~"); } public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public int getId() { return id; } public void setId(int id) { this.id = id; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; }}//4.创建子类class BMW extends Car{ String color = "五彩斑斓的黑"; //5.重写父类的方法 @Override public void start(){ System.out.println("都让开,我的车要起飞啦~"); }}//6.创建子类2class TSL extends Car{ //7.重写父类的方法 @Override public void stop(){ System.out.println("唉呀妈,怎么停不下来呢"); } //8.添加子类的特有功能 public void swim(){ System.out.println("没想到吧,我还是个潜水艇"); }}
package cn.tedu.oop2;public class TestFruit { public static void main(String[] args) { Fruit f = new Fruit(); Apple a = new Apple(); Orange o = new Orange(); get(f); get(a); get(o); } //只需要创建一个方法,就可以执行截然不同的效果 //忽略子类对象的差异统一看作父类类型 public static void get(Fruit f){ f.clean(); }}class Fruit{ public void clean(){ System.out.println("水果要洗洗再吃"); }}class Apple extends Fruit{ @Override public void clean(){ System.out.println("苹果需要削皮"); }}class Orange extends Fruit{ @Override public void clean(){ System.out.println("橙子需要剥皮"); }}
プログラム実行時の違い: インスタンス変数はオブジェクトの属性に属し、そのインスタンス変数に領域が割り当てられ、このインスタンス変数が使用できるようになる前に、インスタンス オブジェクトを作成する必要があります。静的変数はインスタンス オブジェクトではなくクラスに属しているため、クラス変数とも呼ばれます。プログラムがインスタンス オブジェクトを作成せずにクラスのバイトコードをロードする限り、静的変数にはスペースが割り当てられ、静的変数を使用できます。つまり、インスタンス変数は、このオブジェクトを通じて使用する前にオブジェクトを作成する必要がありますが、静的変数はクラス名を使用して直接参照できます。
このプロセスにはポリモーフィックなアプリケーションが存在します。変形には上向き変形と下向き変形の2通りがあります。
上方変換: 異なるサブクラス オブジェクトを親クラスとして扱うことができるため、異なるサブクラス オブジェクト間の差異を保護し、共通のコードを記述し、共通のプログラミングを作成し、呼び出し標準を統一できます。
例: 親クラス Parent、サブクラス Child
親クラスの参照はサブクラス オブジェクトを指します: Parent p=new Child();
注: 上向き変換中、サブクラス オブジェクトは次のようにみなされます。親クラスのオブジェクトは、親クラスの関数のみを呼び出すことができます。親クラスで宣言されたメソッドをサブクラスがオーバーライドする場合、メソッド本体は、サブクラスのオーバーライドされた関数を実行します。ただし、この時点では、オブジェクトはそれ自体を親タイプとみなしているため、他のリソースは引き続き親タイプを使用します。
例: ファ・ムーランは父親のために軍隊に入ります。誰もがファ・ムーランを父親だと思っていますが、実際に軍隊に参加するのはファ・ムーランです。さらに、ファ・ムーランは父親にできることしかできません。軍事キャンプでは化粧をすることは許可されていません。
Downcasting (less): サブクラスの参照はサブクラス オブジェクトを指しており、プロセス中に強制変換を採用する必要があります。これは、以前に上方変換されたサブクラス オブジェクトであり、依然としてサブクラス固有の機能を実行する必要があるため、サブクラス オブジェクトに復元する必要があります。
Parent p = new Child();//上方変換,このとき、p が親の型
Child c = (Child)p;//このとき、親の型 p を小さな型の Child
に変換します。実質的には、サブクラスのオブジェクトを作成するのと同じです親クラスまたは My own
を使用できます。 説明: 下方変換は、サブクラスの特別なメソッドの使用を容易にするためのものです。つまり、サブクラス メソッドの関数が拡張されると、サブクラス関数は次のようになります。直接使用できます。
例: Hua Mulan の戦争が終わった後、彼女は父親とみなされる必要がなくなり、「鏡に黄色を見せる」ことができます
推奨される学習: 「Java ビデオ チュートリアル」 "
以上がJava オブジェクト指向ポリモーフィズムを 1 つの記事でマスターするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。