面向对象之多态

多态

多态,按照字面意思来解释就是多种形态。

一句话概括就是同一种事物不同的表现形态

举个栗子:

在常温下水是以液体的形态呈现;而在零度或者零度以下水又会被冻结以固态的形态呈现;当温度很高的时候水又会被蒸发以气态的形态呈现。

而在程序中可以通过代码描述这种关系,只需满足继承这一关系即可

多态的定义与使用:
父类类型 变量名 = new 子类类型();

变量名.方法名();

  • 普通类多态定义的格式

    父类 变量名 = new 子类();

  • 抽象类多态定义的格式

    抽象类 变量名 = new 抽象类子类();

  • 接口多态定义的格式

    接口 变量名 = new 接口实现类();

多态成员的特点

  • 多态成员变量

    当子父类中出现同名的成员变量时,多态调用该变量时:

    ​ 编译时期:参考的时引用型变量所属的类中是否有被调用的成员变量。没有,编译失败。

    ​ 运行时期:也是调用引用型变量所属的类中的成员变量。

    ​ 口诀:编译和运行都参考等号的左边,编译运行看左边。

  • 多态成员方法

    当子父类中出现同名的成员方法时,多态调用该方法时:

    ​ 编译时期:参考引用变量所属的类,如果类中没有调用的方法,编译失败。

    ​ 运行时期:参考引用变量所指的对象所属的类,运行所属类中的成员方法。

    ​ 口诀:编译看左,运行看右。

以下演示多态成员特点:

/**
 * Project:javaSE
 * Package:demo
 *
 * @date: 2020/12/23
 * @author: CnreCoder
 * @signature: Bug Free
 * @version: 1.8
 */

/***
* 演示多态成员的特点
*/
public class Demo1 {
    public static void main(String[] args) {
        //创建多态对象
        Fu i = new Zi();
        //输出多态对象的成员属性
        System.out.println(i.str);
        //调用多态对象的成员方法
        i.method();
    }

}

/***
 * 父类
 */
class Fu{
    /**
     * 父类成员属性
     */
    String str = "父类变量";

    /**
     * 父类成员方法
     */
    public void method(){
        System.out.println("父类方法");
    }
}

/***
 * 子类
 */
class Zi extends Fu{
    /**
     * 父类成员属性
     */
    String str = "子类变量";

    /**
     * 父类成员方法
     */
    @Override
    public void method(){
        System.out.println("子类方法");
    }
}

多态成员特点

多态中向上转型与向下转型

多态的转型分为向上转型与向下转型两种:

  • 向上转型:当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程。

    格式:

    //父类类型 变量名 = new 子类类型();
    Animal animal = new Animal();
    
  • 向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,这个过程就是向下转型。如果时直接创建父类对象,是无法向下转型的

    格式:

    //子类类型 变量名 = (子类类型) 父类类型的变量;
    //变量animal实际上指向Dog对象
    Dog dog = (Dog) animal;
    

以下演示向上向下转型

/**
 * Project:javaSE
 * Package:demo
 *
 * @date: 2020/12/23
 * @author: CnreCoder
 * @signature: Bug Free
 * @version: 1.8
 */

/***
* 演示多态的向上向下转型
*/
public class Demo2 {
    public static void main(String[] args) {
        //多态    旺财是动物     这里自动使用了向上转型
        Animal animal1 = new Dog();
        //输出动物的name属性
        System.out.println(animal1.name);
        //创建动物对象
        Animal animal2 = new Animal();
        //调用动物方法
        animal2.method();
        //调用旺财方法
        animal1.method();
        //向下转型
        Dog dog = (Dog) animal1;
        //输出旺财的name属性
        System.out.println(dog.name);

    }
}

/**
 * 父类
 */
class Animal {
    /**
     * 父类的属性
     */
    String name = "动物";

    /**
     * 父类的方法
     */
    public void method() {
        System.out.println("动物的方法");
    }
}

/**
 * 子类
 */
class Dog extends Animal {
    /**
     * 子类的属性
     */
    String name = "旺财";

    /**
     * 子类的方法
     */
    @Override
    public void method() {
        System.out.println("旺财的方法");
    }
}

多态的转型

多态的优缺点

优点:

可以提高可维护性(多态前提所保证的),提高代码的可扩展性

为了方便以后使用接口和抽象类时,想访问其中的成员

缺点:

无法直接访问子类特有的成员


如果你学废了就   一键三连   支持支持我吧,谢谢!其他优质文章点击这里即可观看!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值