java学习笔记—— 多态
Posted 玛丽莲茼蒿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java学习笔记—— 多态相关的知识,希望对你有一定的参考价值。
一、 重写
1. 通过下面的例子看重写
2. 不是所有的方法都可以重写,被下面这些关键词修饰的不能重写
- static方法(静态方法属于类不属于对象,所以下面例子中对象b去调用相当于类B自己调用,调用的是属于类B的静态方法)
- final 方法 (被final修饰的属于常量,常量怎么能修改呢?)
- private 方法 (子类无法集成父类的private方法,自然也无法重写)
3. 面试题总结
二、 多态
2.1 多态存在的条件
- 子类重写父类方法
- 父类引用指向子类对象
2.2 多态是方法的多态(重写是方法的重写),属性没有多态(属性不能重写)
2.3 为什么要用多态?
可以使程序更灵活,可以扩展。
动态编译:程序只有在执行的时候才知道对象的实际类型
2.4 多态
首先给出总结(只需要记住总结就行了):
对象能调用哪些方法,主要看等号左边引用的类型;如果调用的方法被子类重写过了,那么执行子类的方法。
1)父类、祖宗类的引用都可以指向子类对象
2)子类重写了父类的方法,那么父类的引用(上转型对象)调用子类重写过的方法(这个前面在重写部分已经讲过了)。
3)对象能调用哪些方法,主要看等号左边引用的类型。
举两个例子
4)类型转换
上面例子中,把父类型per对象强制转换为子类型就可以调用子类的eat函数了
PS: 引用数据类型和基本数据类型的“强制类型转换”刚好相反。
- 对于基本数据类型,高转低需要强转,会损失精度,比如float转int会损失小数。
- 对于引用数据类型,子类转换为父类对象(上转型)会损失子类的部分属性和方法(丢掉了子类更详细的东西,可以理解成损失“精度”),但是不需要强转。反而上图这种父类转子类增加精度的需要强转(下转需要强制类型转换)。
2.5 对象上转型
“动物是老虎的父类,从人的思维方式上来看,说“老虎是动物”属于上溯思维方式,会失去老虎的一些属性和方法”
1)称对象per为上转型对象
Person per = new Student();
或者这样更好理解一些:
Person per;
Student stu = new Student();
per = stu;
此时成对象per为对象stu的上转型对象。
2)对象只能上转不能下转(下转需要强制类型转换),例如不能说“人是中国人”、“动物是老虎”
3)上转型有哪些特点前面都说过了,只不过说的时候还没介绍它是上转型
三、 instanceof运算符
记住一句话 —— “对象 instanceof 父类/父类的父类/祖先类 都为 true”
上面例子中,需要注意的是红色框框出来的。对象的实际类型由等号右边决定。所以stu、per、obj的实际类型都是Student,所以对于instanceof Studnet/Person/Object的结果都是true。
以上是关于java学习笔记—— 多态的主要内容,如果未能解决你的问题,请参考以下文章