面向对象-多态
-
多态指同一个实体同时具有多种形式。它是面向对象程序设计(OOP)的一个重要特征。主要是指同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态。说简单点,就是父类的同一种方法,可以在不同子类中表现出不同的状态,或者说在不同子类中可以实现不同的效果。而且在这个过程中因为是使用父类引用指向子类对象,所以不会涉及到子类特有的方法,只会调用父类中存在的方法。
-
好处是可以把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,统一调用标准。
特点
-
1、 多态的前提是继承——因为继承中存在方法的重写,首先在继承父类后,就可以继承父类的除私有方法外的所有方法,就可以对这些方法进行重写。
-
2、 要有方法的重写——当有了可以重写父类方法的权限后,在不同的子类中就可以重写父类方法,实现自己不同的功能,当然也可以不重写,主要是重写这个功能使得每个子类都独具一格,不会全都相同,这是多态重要的一点。
-
3、 父类引用指向子类对象,如:Animal a = new Dog(); ——小到大,向上转型。这里父类引用指向子类对象,其实相当于把子类对象当父类对象来用,所以这是一种向上转型的引用。
-
4、 多态中,编译看左边,运行看右边——为什么这么说呢?其实主要是针对
Animal a = new Dog();
这个语句而言,在编译时,首先加载的是父类的方法和变量,那么如果子类方法重写方法后,也会加载子类方法。执行看右边,这里主要的意思是在实现程序时,我有两个选择,当我的子类重写父类方法后,就会执行子类重写的方法 ,如果没有重写,那么就会执行父类中的方法。但是多态的特点就是重写。
说简单点,就是方法加载以父类方法为主,方法执行以子类为主。
public class duotai {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建两个对象,分别是相同父类引用指向不同子类对象,并同时调用子类对象。
fu z1 = new zi();
fu z2 = new ziy();
z1.eat();
z2.eat();
}
}
//创建一个父类fu,写一个方法
class fu{
public void eat(){
System.out.println("这是一个吃的方法");
}
}
//创建子类zi,继承父类fu,对父类方法eat()重写,并加一个自己特有的方法xue();
class zi extends fu{
public void eat(){
System.out.println("这是对方法的重写,大儿子想吃面!");
}
public void xue(){
System.out.println("这是子类特有的方法,学习");
}
}
//创建子类ziy,继承父类fu,重写父类方法eat();
class ziy extends fu{
public void eat(){
System.out.println("这是 对父类方法的重写,小儿子想吃粉");
}
}
运行结果如图:
父类引用对象调用子类特有方法时会出错:
优点
-
1、 多态可以让我们不用关心某个对象到底是什么具体类型,就可以使用该对象的某些方法。
-
2、 提高了程序的扩展性和可维护性