栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

面向对象三大特征之多态

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

面向对象三大特征之多态

 多态的概述(记忆)

 

- 什么是多态

  ​    同一个对象,在不同时刻表现出来的不同形态

- 多态的前提

  - 要有继承或实现关系
  - 要有方法的重写
  - 要有父类引用指向子类对象

重载和重写的区别如下(拓展)

1.定义不同---重载是定义相同的方法名,参数不同;重写是子类重写父类的方法。

2.范围不同---重载是在一个类中,重写是子类与父类之间的。

3.多态不同---重载是编译时的多态性,重写是运行时的多态性。

4.返回不同---重载对返回类型没有要求,而重写要求返回类型,有兼容的返回类型。

5.参数不同---重载的参数个数、参数类型、参数顺序可以不同,而重写父子方法参数必须相同。

6.修饰不同---重载对访问修饰没有特殊要求,重写访问修饰符的限制一定要大于被重写方法的访问修饰符。

多态中的成员访问特点(记忆) - 成员访问特点

  - 成员变量

    ​    编译看父类,运行看父类

  - 成员方法

    ​    编译看父类,运行看子类

为什么成员变量和成员方法的访问不一样呢?·

  • 因为成员方法有重写,而成员变量没有
package com.object_02;

public class AnimalDemo9 {
    public static void main(String[] args) {
        //有父类引用指向子类对象
        Animal9 a = new Cat9();

        System.out.println(a.age);
//        System.out.println(a.weight);
// 因为成员变量​编译看和运行看父类,父类中没有,所以weight报错
// 运行出的age也是父类的40

        a.eat();
//        a.playGame();
//因为成员方法编译看父类,父类Animal中只有eat方法,所以playGame方法报错
//因为运行看子类,所以eat方法运行的结果是子类重写后的"猫吃鱼"
    }
}

实例:

package com.object_02;

public class Animal9 {
        public int age = 40;

        public void eat() {
            System.out.println("动物吃东西");
        }
    }


package com.object_02;

public class Cat9 extends Animal9 {
    public int age = 20;
    public int weight = 10;


    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }

    public void playGame() {
        System.out.println("猫捉迷藏");
    }
}


package com.object_02;

public class AnimalDemo9 {
    public static void main(String[] args) {
        //有父类引用指向子类对象
        Animal9 a = new Cat9();

        System.out.println(a.age);
//        System.out.println(a.weight);
// 因为成员变量​编译看和运行看父类,父类中没有,所以weight报错
// 运行出的age也是父类的40

        a.eat();
//        a.playGame();
//因为成员方法编译看父类,父类Animal中只有eat方法,所以playGame方法报错
//因为运行看子类,所以eat方法运行的结果是子类重写后的"猫吃鱼"
    }
}

多态的好处和弊端(记忆) - 好处

  ​    提高程序的扩展性。定义方法时候,使用父类型作为参数,在使用的时候,使用具体的子类型参与操作

- 弊端

  ​    不能使用子类的特有成员

多态中的转型(应用) - 向上转型(从子到父)

  ​    父类引用指向子类对象就是向上转型

格式:父类型 对象名 =new 子类型;

//向上转型
        Animal a = new Cat();
        a.eat();
//      a.playGame();   //成员方法编译看父类,父类没有playGame方法,报错
- 向下转型(从父到子)

解决了多态的弊端,从而可以使用子类的特有成员  

  ​    格式:子类型 对象名 = (子类型)父类引用;

 //向下转型
        Cat c = (Cat)a;
        c.eat();
        c.playGame();   //解决了多态的弊端,从而可以使用子类的特有成员  

拓展:

instanceof 是 Java 的一个二元操作符,类似于 ==,>,< 等操作符。

instanceof 是 Java 的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型。

以下实例创建了 displayObjectClass() 方法来演示 Java instanceof 关键字用法:

import java.util.ArrayList;
import java.util.Vector;
 
public class Main {
 
public static void main(String[] args) {
   Object testObject = new ArrayList();
      displayObjectClass(testObject);
   }
   public static void displayObjectClass(Object o) {
      if (o instanceof Vector)
      System.out.println("对象是 java.util.Vector 类的实例");
      else if (o instanceof ArrayList)
      System.out.println("对象是 java.util.ArrayList 类的实例");
      else
      System.out.println("对象是 " + o.getClass() + " 类的实例");
   }
}

以上代码运行输出结果为:

对象是 java.util.ArrayList 类的实例

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/991903.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号