多态的详解

多态的前提

/*
    多态是同一个行为具有多种不同表现形式。
    多态的前提:
        1.继承/实现关系
        2.有方法重写
        3.父类引用指向子类对象(接口指向实现类对象)
 */
public class Test {
    public static void main(String[] args) {
        //父类引用指向子类对象
        Printer p1 = new ColorPrinter();
        p1.print();

        Printer p2 = new BlackPrinter();
        p2.print();
    }
}

多态的访问特点和运行过程

/*
    编译期间
        由java文件变成class文件的过程
    运行期间
        运行代码的过程

    多态下方法的访问特点:编译时看左边,运行时看右边
    多态下变量的访问特点:编译时看左边,运行时也看左边(变量没有多态性)

    多态的缺点:
        在多态下,无法访问子类特有的成员。
 */
public class Test01 {
    public static void main(String[] args) {
        Animal a1 = new Dog();
        System.out.println(a1.name); //编译时看左边,运行时也看左边(变量没有多态性)
        a1.run(); //编译时看左边,运行时看右边
    }
}

缺点

通过多态的父类引用无法访问子类所特有的成员和方法

代码

/*
    多态的缺点:
        在多态下,无法访问子类特有的成员。
    解决办法:
        使用强制类型转换
                Animal a = new Dog();
                Dog dog = (Dog) a;
        解决类型转换异常:使用 instanceof 判断类型
 */
public class Test02 {
    public static void main(String[] args) {
        //自动类型转换(向上转型)
        Animal a = new Dog();

        //强制类型转换(向下转型)
        //可能有类型转换异常 ClassCastException
        //在强转前,做类型的判断
        /*
            对象名 instanceof  类名
                判断 对象 是否 属于类,是返回true,否则返回false
         */
        if(a instanceof Dog){
            Dog dog = (Dog) a; //强转
            dog.lookHome();
        }else {
            System.out.println("当前类型不是Dog");
        }

    }
}

优点

方法的参数是父类类型,调用方法时就可以传入任意的子类对象
可以提高方法的通用性和灵活性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值