java基础——面向对象的三大特性之一【多态性】

面向对象的特点:
(1)封装性 (见 https://blog.csdn.net/weixin_41550144/article/details/86478279)
(2)继承性 (见 https://blog.csdn.net/weixin_41550144/article/details/86480020)
(3) 多态性

Java引用变量有两种类型:一个是编译时类型,一个是运行时类型,编译时类型由声明该变量时使用的类型来决定,运行时类型由实际赋给该变量的对象决定,如果编译时的类型和运行时的类型不一致,就可能出现多态。
解释:从军时登记的是父亲的信息,但是实际参军时却是花木兰。

  1. 多态性的定义
    指允许不同类的对象对同一消息做出响应。即同一消息可以根据放送对象的不同而采取多种不同的行为方式。

  2. Java多态性的实现是以封装性和继承性为基础的,多态性存在的三个必要条件:

  • 继承
  • 覆写/重写
  • 父类引用指向子类对象
  1. 多态性的优点
    可替换性、可扩充性、接口性、灵活性和简化性。

  2. 首先来了解一下,什么是向上转型?
    假设存在一个父类Person类和一个子类Student类,语句<Person p=new Student();>表示:父类的引用p是指向堆空间中存储的Student类的实例化对象的,就是向上转型。
    解释:就是花木兰替父参军,但是是一直被叫做父亲的名字”花弧”的

  • 说明:引用p只能访问父类中的属性和方法。一方面,对于子类中存在的方法,但是父类中不存在的方法,引用p是 不可以使用的。 解释:花木兰在边疆顶替的是父亲,所以不能体现出来“化妆”的方法,所以花木兰特有的方法而父亲没有,所以不能使用。另一方面,如果子类覆写了父类的方法,在调用的时候,必定是使用子类已经覆写过得方法。 解释:父亲可以骑马杀敌,木兰后来也可以骑马杀敌,但是有自己骑马杀敌的方法和技巧,所以就实现了“覆写”,则在真实的战场上,是花木兰的骑马杀敌。
  1. 什么是向下转型?
    在向下转型时,一定要先发生向上转型,否则会出现错误: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

总结

  1. 方法的多态性
  • 方法的重载
  • 方法的覆写
  1. 对象的多态性(前提是方法覆写)
  • 对象的向上转型:父类 父类对象=子类实例;
  • 对象的向下转型:子类 子类对象=(子类)父类实例。

(文中花木兰替父参军例子来自 https://www.zhihu.com/question/30082151)

(欢迎批评指正!)

猜你喜欢

转载自blog.csdn.net/weixin_41550144/article/details/86494207