面向对象-多态

一、多态的介绍

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 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里2 天前
java中的继承和多态的区别
java
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕2 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码2 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖2 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时2 天前
01-06-A-JVM排查实战详解
java·jvm
伞伞悦读2 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
vipxieliang2 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
C语言小火车2 天前
C/C++ 为什么需要编译器?
开发语言·c++