面向对象-多态

一、多态的介绍

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();
    }
}
相关推荐
@卓越俊逸_角立杰出@1 小时前
快速学会 Java 实现意图识别:从规则匹配到 BiLSTM 分类器
java·开发语言·人工智能
wear工程师1 小时前
接口超时别只调大 timeout:Java HTTP 客户端其实有 3 段等待
java·http
小小龙学IT1 小时前
simdjson:利用 SIMD 指令实现 GB/s 级 JSON 解析的 C++ 开源库
开发语言·c++·json
ydyd202604211 小时前
设备OEE怎么提升?数据采集+分析优化的完整方案
java·服务器·前端
A_nanda1 小时前
c#WPF开发常见问题
开发语言·c#·wpf
Hello.Reader1 小时前
REALITY 技术深度解析从 TLS 伪装、抗主动探测到 VLESS + XTLS Vision 完整实践
开发语言·php
(╹◡╹)2 小时前
11.RK3588本地大模型内存评估优化
java·linux·前端
不正经学生2 小时前
C语言字符串函数进阶:安全版函数 + 错误处理 + 子串查找
c语言·开发语言·c++·算法·面试
ITKEY_2 小时前
neovim基于nvim-jdtls 开发java报错
java·开发语言