面向对象的三大特性之一多态

面向对象的三大特性之一多态

## 什么是多态

  • 即 同一方法,可以根据发送对象的不同而采取多种不同的行为方式

  • 一个对象的实际类型是确定的,但是可以指向对象的引用类型有很多(父类的引用指向子类)

多态存在的条件

  • 有继承关系
  • 子类重写父类方法
  • 父类引用指向子类对象
 /*一个对象的实际类型是确定的
                new Student();
                new Persion();
         */
        //但是对象的引用类型是不确定的:父类的引用指向子类

        // Student(子类) 能调用的方法可以是自己的也可以是从父类继承来的方法
        Student s1 = new Student();

        //Persion(父类) 可以指向子类,但不能调用子类独有的方法
        Persion s2 = new Student();

        Object s3 = new Student();

        //测试1(重写前)
        s2.run();
        s1.run();

        //测试2(重写后)
        //s2.run();方法重写后,父类的方法执行的是重写后的子类方法
        //s1.run();

        //测试3
        //对象可以调用哪些方法,主要看对象左边的类型,和右边的关系不大
        //s2.eat(); 无法调用eat方法
        s1.eat();

注意

多态是方法的多态,属性没有多态性

instanceof

instanceof (用来在运行时判断对象是否是指定类及其父类的一个实例)

/*测试4
        System.out.println(x instanceof y)
        1.就是看x和y有没有继承关系,没有就直接报错
        2.然后看x的实际类型(就是new的类型)是不是y的子类或者y本身,是就true,不是就false
        3.如果x的实际类型是y的父类,就false


        //Object>Animal>Cat
        //Object>Animal>Dog
        //Object>String

        Object object = new Cat();
        System.out.println(object instanceof Object);//true
        System.out.println(object instanceof Animal);//true
        System.out.println(object instanceof Cat);//true
        System.out.println(object instanceof Dog);//false
        System.out.println(object instanceof String);//false
        System.out.println("===================================");
        Animal animal = new Cat();
        System.out.println(animal instanceof Object);//true
        System.out.println(animal instanceof Animal);//true
        System.out.println(animal instanceof Cat);//true
        System.out.println(animal instanceof Dog);//false
        //System.out.println(animal instanceof String);//编译出错
        System.out.println("===================================");
        Cat cat = new Cat();
        System.out.println(cat instanceof Object);//true
        System.out.println(cat instanceof Animal);//true
        System.out.println(cat instanceof Cat);//true
        //System.out.println(cat instanceof Dog);//编译出错
        //System.out.println(cat instanceof String);//编译出错
*/

类型之间的转换

作用:减少重复代码,方便方法的调用

//类型之间的转换
        //1.高转低
        Animal obj = new Animal();
        Cat obj1 = (Cat) obj;//转换类型:父类转子类
        obj1.go();//调用子类方法
        //或者直接写成 ((Cat)obj).go();
         //2.低转高  子类转换成父类可能会丢失自己本来的一些方法
        /*Cat cat = new Cat();
        Animal animal=cat;
        Animal.go();
         */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值