继承和多态再一次理解
程序员文章站
2022-03-03 12:39:24
...
继承
1.java语言中子类继承父类都继承那些数据?
- 私有数据不支持继承。
- 构造方法不支持继承。
- 其他数据都可以继承。
2.java中任何类都默认继承Object类,并且任何一个类都有Object的特征。
3.什么是方法重写?
当父类中的方法无法满足当前子类的业务需求的时候,子类有必要将父类中继承过来的方法进行重写编写。这叫做方法的重写,overwrite。回忆下重载是什么?
4.满足什么条件的时候会发生方法的重写呢?
- 方法重写发生在具有继承关系的父子俩之间。
- 方法样子长的一样。
- **访问权限不能更低。**也就是父类中方法是public,子类重写的时候不能变成private。
- 抛出异常不能更多,可以更少,这个不清楚?
5.静态方法不存在覆盖。
多态
核心机制。
1.多态中的几个概念
-
向上转型(upcasting)
子类型转换成父类型,实际因为父类更通用,又被称为自动类型转换。
-
向下转型(downcasting)
强制类型转换
2.经典:父类型的引用指向子类型的对象。这句话要理解深刻要看编译阶段和运行阶段。
3.静态绑定和动态绑定。
-
编译期绑定,静态绑定。这时候编译器检查Animal 中有move()方法,符合语法规范。
-
运行阶段绑定,动态绑定。new 的啥底层就是啥对象,cat调用的就是啥对象的方法。
-
无论Cat类中有没有重写move()方法,运行阶段一定调用的是Cat对象的 move方法。因为底层的真实对象就是Cat对象。
-
由于在编译阶段和运行阶段绑定不同的形态,所以这种机制被称为多态的语法机制。
Animal cat = new Cat();
cat.move()//这里move调的是Cat()对象的move()方法。
4.向下转型
-
如果调用方法只存在子类中,对象.方法会在编译阶段报错。
-
要使用子类型中特有的方法的话,要强制类型转换。
-
两者之前要存在继承关系,否则强制类型转换会出现运行时ClassCastExpection错误(程序可以正常编译)。
-
怎么避免出现向下类型出现的异常呢?
使用instanceof运算符可以避免以上错误。
格式:引用 instanceof 数据类型名
以上运算符的结果是boolen类型
if(a instanceof Cat){ Cat c = (Cat)a; c.catchMouse(); }else if(a instanceof Bird){ Bird b = (Bird)a; b.fly(); }
-
多态的作用:降低程序耦合度,提高扩展性。
-
面向抽象编程,尽量不要面向具体编程。(需要多实践才能更深刻)