面向对象的特点:
(1)封装性 (见 https://blog.csdn.net/weixin_41550144/article/details/86478279)
(2)继承性 (见 https://blog.csdn.net/weixin_41550144/article/details/86480020)
(3) 多态性
Java引用变量有两种类型:一个是编译时类型,一个是运行时类型,编译时类型由声明该变量时使用的类型来决定,运行时类型由实际赋给该变量的对象决定,如果编译时的类型和运行时的类型不一致,就可能出现多态。
解释:从军时登记的是父亲的信息,但是实际参军时却是花木兰。
-
多态性的定义:
指允许不同类的对象对同一消息做出响应。即同一消息可以根据放送对象的不同而采取多种不同的行为方式。 -
Java多态性的实现是以封装性和继承性为基础的,多态性存在的三个必要条件:
- 继承
- 覆写/重写
- 父类引用指向子类对象
-
多态性的优点:
可替换性、可扩充性、接口性、灵活性和简化性。 -
首先来了解一下,什么是向上转型?
假设存在一个父类Person类和一个子类Student类,语句<Person p=new Student();>表示:父类的引用p是指向堆空间中存储的Student类的实例化对象的,就是向上转型。
解释:就是花木兰替父参军,但是是一直被叫做父亲的名字”花弧”的
- 说明:引用p只能访问父类中的属性和方法。一方面,对于子类中存在的方法,但是父类中不存在的方法,引用p是 不可以使用的。 解释:花木兰在边疆顶替的是父亲,所以不能体现出来“化妆”的方法,所以花木兰特有的方法而父亲没有,所以不能使用。另一方面,如果子类覆写了父类的方法,在调用的时候,必定是使用子类已经覆写过得方法。 解释:父亲可以骑马杀敌,木兰后来也可以骑马杀敌,但是有自己骑马杀敌的方法和技巧,所以就实现了“覆写”,则在真实的战场上,是花木兰的骑马杀敌。
- 什么是向下转型?
在向下转型时,一定要先发生向上转型,否则会出现错误:ClassCastException.
语句<Student s=(Student) p;>,引用p是通过向上转型得到的,然后进行向下转型,使得能够使用子类拥有的方法而父类不存在的方法。 解释:花木兰从军回来之后就成为了自己,就是向上转型后进行的向下转型,就可以化妆穿女生的衣服了,即可以实现父类没有的方法了。
代码示例:
class Person{//父类
public void fun1() {
fun2();
}
public void fun2() {
System.out.println("AAA");
}
}
class Student extends Person{//子类
public void fun1(int x) {//重载(overload)了父类的方法,相当于是子类的新的方法
System.out.println("BBB");
}
public void fun2() {//覆写(override)了父类的方法
System.out.println("CCC");
}
}
//主方法
public class TestDemo{
public static void main(String[] args){
Person p=new Student();//向上转型
p.fun1();
Student s=(Student) p;//向下转型
s.fun1();
s.fun1(1); //改方法是子类拥有,而父类没有的方法
}
}
运行结果:
CCC
CCC
BBB
总结:
- 方法的多态性
- 方法的重载
- 方法的覆写
- 对象的多态性(前提是方法覆写)
- 对象的向上转型:父类 父类对象=子类实例;
- 对象的向下转型:子类 子类对象=(子类)父类实例。
(文中花木兰替父参军例子来自 https://www.zhihu.com/question/30082151)
(欢迎批评指正!)