JAVA学习笔记9-------多态


对象的多态性 一个对象对应着不同类型
在代码中:父类或者接口的引用指向其子类的对象
父类引用指向子类对象
比如动物引用既可以指向猫也可以指向狗

public static void method(Animal a)
{
    a.eat();
}


都继承自animal抽象类所以均有eat方法 无论是狗还是猫

多态弊端和前提
    前期定义的内容不能调用后期子类特有的内容
    1 多态必须有关系 继承或实现
    2 要有覆盖
多态转型
    Animal a = new Cat();//自动类型提升 猫对象提升为动物类型
    //一旦提升完成 就按照动物来访问 而不能访问子类的特有功能
    //作用限制对特有功能的访问 向上转型
//若还想用猫的特有功能 那么就可以进行向下转型
Cat a = (Cat)a;//强转 自动提升 很像基本数据类型 
但是 Animal a = new Animal(); Cat c = (Cat)a;这样绝对不行 会出现类型转化异常
因为推而广之 动物引用可以指向狗对象 你还可以强转么?
所以对于转型 自始至终都是子类对象在做着类型的变化 (子类在变化)

当父类引用指向子类对象的时候
父类中有的方法 当然可以访问
子类对象中覆盖父类后的方法 当然也可以访问
但子类中的特有方法 不可以访问
我是父类引用 我是看着父类的功能来调用子类与之对应的功能
但如果父类没有 子类独有的那种 我怎么会知道
所以最好是抽象类或者接口 这样子类就均要实现所有父类中的方法无后顾之忧
当你想访问独有的方法的时候可以向下转型
转型一直都是子类在做变化 向上转成父类型 向下就回到本类型

多态类型判断

public static void method(Animal a)
{
    a.eat();
    if(a instanceof Cat)//instanceof 用于判断对象对象对象的具体类型 只能用于引用数据类型判断
    //要判断就判断具体类型
    {
            Cat c = (Cat)a;
            c.catchMouse();
    }else if(a instanceof Dog)
    {
        Dog d = (Dog)a;
        d.lookHome();
    }
}

多态特点
成员特点
1 成员变量
    多态一般必须要覆盖 而覆盖一般都是函数
    所以对于成员变量而言 编译时参考引用型变量所属的类中是否有调用的成员变量 有通过 没有编译失败
    运行时依然是参考引用型变量所属类中是否有调用的成员变量
    当父类引用指向子类对象的时候 编译和运行都参考等号的左边即父类
    编译运行均看左
2 成员函数(非静态) 谁被new了 我就绑定谁了
    多态的实质根本是父类中的方法在子类中被覆盖了 那么当我创建一个父类引用指向子类对象的时候
    我访问这个被覆盖的方法的时候就会先找子类的这个方法 然若子类没有覆盖 我访问的话就去寻找父类的这个方法
    一旦出现多态就出现向上转型 就有一个顺序的查找过程 由子类然后查找父类
    编译时 参考引用型变量所属的类中是否有调用的函数 有通过 没有 失败
    运行时 参考的是对象所属的类中是否有调用的函数
    编译时看左边  如果父类都没有编译都不通过
    运行时看右边
3 静态函数
    非静态依赖于对象 所以对象绑定为啥 访问就是啥
     对于静态函数 虽然子类覆盖了但是对于静态函数是不依赖对象调用的 它是依赖类的
     静态代表类一加载便会存在 所以此时便依赖于引用 引用是父就是访问父
     多态多态 都是对象的多态性 和类无直接关系 这些静态同名函数在一开始的时候
     便自己绑定好了自己所属的类
     编译 参考引用型变量所属的类中是否有调用的静态方法
     运行时 参考引用型变量所属的类中是否有调用的静态方法
     简单说 编译运行均看左边 
     对于静态方法 直接类名调用即可
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值