面向对象-多态

一、多态的介绍

1、前提:

a、必须要有子类继承父类或者接口之间的关系

b、必须要有方法的重写,没有重写没有意义。多态主要针对的是方法的重写

c、new对象:父类引用指向子类对象

Fu fu = new Zi() ->理解为大类型接收小类型

2、注意:多态下不能直接调用子类特有的功能

java 复制代码
//定义抽象类
public abstract class Animal {
    public abstract void eat();
}
//定义实现类
public class Dog extends Animal{
    @Override
    public void eat() {

    }
    public void lookDoor(){
        System.out.println("小狗看门");
    }
}
//定义测试类
public class Test {
    public static void main(String[] args) {
        Animal animal = new Dog();
        animal.eat();  //调用的是dog对象
//        animal.lookDoor(); //多态前提下,不能直接调用子类特有成员
    }
}

二、多态条件下成员的访问特点

2.1、成员变量:看等号左边是谁,先调用谁中的成员变量

2.2、成员方法:看new的是谁,先调用谁中的成员方法,子类没有,招父类

java 复制代码
public class Fu {
    int num = 100;
    public void method(){
        System.out.println("我是父类中的方法");
    }
}
public class Zi extends Fu{
    int num = 10;
    public void method(){
        System.out.println("我是子类中的方法");
    }
}
public class Test {
    public static void main(String[] args) {
        Fu fu = new Zi();
        //成员变量看左边
        System.out.println(fu.num);//100
        //成员方法看右边new的是谁
        fu.method();//我是子类中的方法
    }
}

三、多态的好处

多态方式和原始方式new对象的优缺点

1、原始方法

a、优点:既能调用重写的,还能调用父类非私有的,还能调用自己特有的。

b、缺点:扩展性差。

2、多态方式

a、优点:扩展性强。

b、缺点:不能直接调用子类特有功能

java 复制代码
public abstract class Animal {
    public abstract void eat();
}
public class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println("小狗在吃骨头");
    }
    //子类特有功能
    public void lookDoor(){
        System.out.println("小狗看门");
    }
}
public class Cat extends Animal{
    @Override
    public void eat() {
        System.out.println("猫在吃鱼");
    }
    public void catchMouse(){
        System.out.println("小猫捉鱼");
    }
}
//原始方法new对象
public class Test01 {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.eat();
        method(dog);
    //当需要一个Cat类时,需要在创建一个方法
    }
    public static void method(Dog dog){
        dog.eat();
        dog.lookDoor();
    }
}
//多态方式new对象
public class Test02 {
    public static void main(String[] args) {
        Animal animal = new Dog();
//        animal.lookDoor();//不能调用子类特有的
        Animal cat = new Cat();
        method(cat);
        //当需要dog时,new Dog,method方法即可

    }

    /**
     *形参传递父类类型,调用次方法父类类型可以接收任意他的子类类型
     *传递哪个子类对象,就指向哪个子类对象,调用哪个子类中重写的方法
     */
    public static void method(Animal animal){
        animal.eat();
    }
}
相关推荐
论迹复利31 分钟前
FreeRTOS 在 RISC-V 上是如何“点火“的 —— 从 main() 到第一个任务的完整链路
java·开发语言·risc-v
张宇Joaquin1 小时前
鲲鹏统一并行加速库KUPL--众核并行能力介绍
java·开发语言·网络
736c1 小时前
C语言-数组 07
c语言·开发语言
宸津-代码粉碎机1 小时前
AI攻防战升级!基于Spring AI构建Java应用自动免疫安全体系
java·大数据·开发语言·人工智能·python·安全·spring
2601_963749102 小时前
越华环保集团数字化污水治理:端边云采集架构与平台对接实现
java·大数据·架构
xcLeigh3 小时前
Go入门:整数类型的溢出与安全边界
java·安全·golang
LorryJovens3 小时前
【LAAP科研】CEN因果等价网络理论---从双缝干涉到因果等价
开发语言·php
源码宝3 小时前
SpringBoot+Vue2 诊所门诊管理系统,完整前后端源码,可直接部署上线
java·源码·his系统·门诊系统·程序代码·诊所系统·门诊his
yychen_java3 小时前
九:Text-to-SQL 智能数据查询与 Human-in-the-Loop 人机协作
java·人工智能·架构
Brilliantwxx4 小时前
【Linux】 进程(10) 进程控制深度解析:创建、终止与等待
linux·运维·服务器·c语言·开发语言·网络