目录
1.向上转型
1.概念:
2.代码示例:
2.动态绑定
3.方法重写
4.理解多态
5.一个"坑"
1.向上转型 1.概念:
向上转型:父类引用指向一个子类的实例,这种写法称为向上转型.
2.代码示例:向上转型发生的时机有以下三种:
直接赋值
方法传参
方法返回
直接赋值的写法:
方法传参的写法:
方法返回的写法:
2.动态绑定当父类和子类中出现了同名的方法的时候,我们去调用这个方法会出现什么样的现场呢?直接上代码:
我们可以发现,虽然 animal 和 cat 都是 Animal 的类型引用,但是 animal 指向的是 Anima 类型的实例,而 cat 指向的是 Cat 类型的实例;在针对 animal 和 cat 分别调用eat方法之后,会发现前者调用了父类的eat方法,而后者调用了子类的eat方法;
因此,在java中,调用了某个类的方法,究竟是执行了那段代码(是父类方法的代码还是子类方法的代码),要看这个引用指向的是父类对象还是子类对象,而这个过程是程序运行时决定的(而不是编译期),因此称为动态绑定.
3.方法重写针对上图的eat方法来说:子类实现了父类的同名方法,并且参数的类型以及参数的个数完全相同,这种情况称为方法重写(Override)
注意事项:
1.区分好重写和重载(重载:方法名称相同,参数类型和参数个数不同)
2.普通方法可以重写,但静态方法(被static修饰的方法)不能重写
3.重写中子类的方法的访问权限不能低于父类的方法访问权限
(访问权限:public>protected>default>private)
4.重写的方法返回值的类型不一定和父类的方法相同(但最好写成相同的)
4.理解多态多态的含义:一个引用,能表现出多种不同的形态
多态的条件:
1.发生向上转型
2.父类跟子类具有同名的覆盖方法
3.通过父类引用调用这个重写的方法
多态的优点:
1.类调用者对类的使用成本进一步降低.
2.降低代码的"圈复杂度"
3.可扩展能力强
当类的调用者在编写 drawMap 这个方法的时候, 参数类型为 Shape (父类), 此时在该方法内部并不知道, 也不关注当 前的 shape 引用指向的是哪个类型(哪个子类)的实例. 此时 shape 这个引用调用 draw 方法可能会有多种不同的表现 (和 shape 对应的实例相关), 这种行为就称为 多态.
5.一个"坑"在构造方法中调用重写的方法也会造成触发动态绑定,但最好不要这做,会产生难以发现的问题.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)