面向对象-多态

一、多态的介绍

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();
    }
}
相关推荐
哦虎!2 小时前
【JavaEE】网络初识
java
for_ever_love__2 小时前
MySQL ORDER BY 排序优化:从 Using filesort 到索引有序扫描(含双路 / 单路排序原理)
java·mysql·优化·存储·by·order·filesort
程序猿追3 小时前
kotlin-retry 接入鸿蒙后,怎样确认它真的会停止重试
开发语言·kotlin·harmonyos
我是人✓3 小时前
Java文件上传三方式对比:从传统到SpringBoot
java·开发语言
智能直播3 小时前
网络RTMP拉流不卡顿、声音不同步,一文讲透缓冲区、时间戳
开发语言·ffmpeg·php·音视频·视频编解码
欣栀♡3 小时前
JVM 频繁 Full GC 先看日志括号里的 cause,jstat 的 FGC 在 JDK 8 上会骗人
java·jvm
IT研究室3 小时前
最新计算机毕业设计选题推荐-基于spring boot的葡萄酒文化宣传网站-网站-文档指导-Java-springboot
java·spring boot·课程设计
慧都小项3 小时前
MyEclipse 中创建和测试 JAX-RS REST 接口:从项目配置到 REST Explorer
java·restful·myeclipse·jax-rs
Wang's Blog3 小时前
Java 项目实战: 交友项目 - 入门案例:编写 Dubbo 服务提供者
java·dubbo·交友
墨云安全4 小时前
内网资产无法暴露到公网,怎么做安全检测?2026 年内网渗透测试的落地路径
开发语言·安全·网络安全·渗透测试·php