首先Java是一门面向对象的编程语言。而面向对象的三大基本特征为:封装,继承,多态。

封装和继承我们都了解 ,那什么是多态呢?

多态简单理解就是一个方法有多种行为。

概念上来说,所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量调用的方法在编译时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,而该引用变量调用的方法到底是哪个类中实现的方法,必须在在程序运行期间才能决定。

多态也称为动态绑定。

(有兴趣的可以深入底层了解动态绑定原理 去如下地址:)

在具体了解多态前,必须要清楚的明白什么是向上转型。

向上转型就是把某个对象的引用视为其基类(父类)的引用的做法称为向上转型。

有一个Child类,Boy类和Girl类是Child类的子类,看下面的例子。

Boy b = new Boy();

对于这个代码就非常好理解,就是实例化了一个Boy对象。

Child c = new Boy();

而这个代码的意思则是说,定义了一个Child类型的引用c,它指向的是一个Boy对象实例。又因为Boy类继承于Child类,而Child中的方法也必定存在于Boy类中,所以c引用是可以指向Boy的对象。

我们再看下面这个例子,好好了解下向上转型。

public class Child {
	void age(){
		System.out.println("Child's age");
	}
}

public class Boy extends Child{
	void age(){
		System.out.println("Boy's age");
	}
}

public class Test{
	public static void main(String[] args) {
        //创建一个Child 实例对象
        Child c = new Child();
        c.age();
        //创建一个指向Boy对象的Child引用
        Child c1 = new Boy();
        c1.age();
    }
}

结果如下:

Child's age
Boy's age

这里就说明了,父类引用指向的实例化对象是谁,就调用谁的方法。

================================================================================================

那多态怎么理解呢?请看下面的例子。

public class Father {
	void age(){
		System.out.println("Father's age");
	}
}

/**Father的一个子类**/
public class Son extends Father {
	void age(){
		System.out.println("Son's age");
	}
}

/**Father的一另个子类**/
public class Daughter extends Father {

	void age(){
		System.out.println("Daughter's age");
	}	
}


public class GetPeopleAge {
	
	Father f = new Father();
	
	/**根据传入的对象 获取该对象的年龄**/
	public void getAge(Father father){
		f = father;
		f.age();
	}
	
	
	public static void main(String[] args) {
		GetPeopleAge g = new GetPeopleAge();
		/**father的引用 指向 Son对象**/
		Father f = new Son();
		g.getAge(f);
		/**father的引用 指向 Daughter对象**/
		f = new Daughter();
		g.getAge(f);
	}
}

结果如下:

Son's age
Daughter's age

这个例子就很好的说明了多态,father类有两个子类,分别为son类和daughter类,而每个类又都覆盖了father类的中的age()方法,然后我们在GetPeopleAge类中创建一个father类的对象,并且创建一个获取father类age()方法的getAge()方法。通过创建GetPeopleAge类 并且创建father类的引用指向不同的子类对象,且调用并传入getAge()方法。

在运行程序前,根本不知道GetPeopleAge类的getAge方法中f指向的是谁的实例,所以也无法确定调用father,son,daughter三个类中谁的age()方法。

最终根据father引用指向不同的对象而调用不同的age方法,有不同的实现,这就体现了多态在运行中才能确定到底调用那个类的方法。

所以多态总结如下:

多态建立于继承关系上的,父类的引用指向不同的对象,而根据对象不同,对方法的实现也不同,所执行产生的行为也不同。