面向对象-多态

一、多态的介绍

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();
    }
}
相关推荐
1024奇点7 小时前
【仓颉语言入门 · 第二篇 第 22 课】
开发语言·ide·开源
Warren2Lynch8 小时前
C4 模型详解:利用 Visual Paradigm 可视化软件架构的综合指南
开发语言·uml
天河归来8 小时前
第三方接口不稳定,如何让核心任务继续完成
java·大数据
Knight_AL8 小时前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查
java·开发语言
FRing039 小时前
vue2干货总结2(v-bind、v-for、v-model、指令修饰符、v-bind操作class和style)
开发语言·前端·vue.js·vue2
by209999 小时前
C++ 智能指针的所有权与使用
开发语言·c++·经验分享
砚底藏山河10 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
IT召唤狮10 小时前
开源企业级零信任项目Pangolin,零信任能挡住PHP核弹漏洞吗?
开发语言·开源·php
知已难寻10 小时前
03 · OpenStack的计算管理 Nova
运维·服务器·开发语言·云原生·云计算·openstack·开源软件
Rover Ramble10 小时前
C++ 用互斥锁实现读写锁
开发语言·c++