java多态性的理解

(1)、多态的定义

多态按字面的意思就是“多种状态”。我的理解是父类的对象引用可以指向父类对象也可以指向不同子类对象的一种特征。实现多态的技术称为动态绑定,是指在执行期间判断所引用对象的实际类型(如Object obj=new A(),则A为obj的实际类型),根据其实际的类型调用其相应的方法。


(2)、多态存在的三个必要条件:

 一、要有继承

class A{
	......
}
//B类继承了A类
class B extends A{
	......
}

A是Object的子类,这里可以不显示地声明。作为子类,B的实例拥有A所有的成员变量,但对于private的成员变量B却没有访问权限,这保障了A的封装性。

二、要有重写

class A{
	
	public  void show(A a){
		System.out.println("A中的aaa");
	}
}
//B类继承了A类并复写了A类的show(A)方法
class B extends A{
	public void show(A a){
		System.out.println("B中的aaa");	
	}
	public void show(B b){
		System.out.println("B中的bbb");	
	}
}

以上代码说明了B继承了A类,并且重写了A类中的show(A )方法。提示:方法重写时,方法签名必须与父类中的方法完全一致(方法名及参数列表),否则重写不成功,其中包括“返回值”。变量不能被重写,”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。

三、父类引用指向子类对象

A a = new B();//a引用指向B的对象

      该引用只能调用父类中定义的方法和变量,而子类中非继承父类或者重写父类方法的方法不能调用,如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法。


(3)、理解多态的例子(代码)

class A{
	
	public  void show(A a){
		System.out.println("A中的aaa");
	}
	public void show(D d){
		System.out.println("A中的ddd");
	}
}

class B extends A{
	//重写了A类中的show(A )方法
	public void show(A a){
		System.out.println("B中的aaa");	
	}
	//B类的自己的方法
	public void show(B b){
		System.out.println("B中的bbb");	
	}
}
class C extends B{	
}
class D extends B{
}
public class Test{
	public static void main(String[] args) {
	 A a=new B();  //对象引用a指向B类型对象
	 B b=new B();	
	 C c=new C();
	 D d=new D();
	 a.show(b);             //输出结果为:B中的aaa
	 a.show(c);		//输出结果为:B中的aaa
	 a.show(d);		//输出结果为:A中的ddd
	 b.show(b);             //输出结果为:B中的bbb
	 b.show(c);		//输出结果为:B中的bbb
	 b.show(d);		//输出结果为:A中的ddd
	
	 }
}

            java执行方法时,是动态匹配的(动态绑定机制),会根据对象的实际类型得到相应的方法并调用该方法。以上代码运行之后,在执行到a.show(b)时,因为a的实际类型是B,会在B中找show(B),但a引用只能调用A类中定义的方法(a的声明类型是A),而B中的show(B)方法是B自己的(不是继承A的方法,也不是重写A中的方法),故不能调用。B中没有相应的方法再到父类A中搜索。如果依然没有,因为B是A的子类,则b自动向上转型为A类型,再继续以上的搜索,B类中有重写父类的show(A),则调用此方法,故输出:B中的aaa;程序继续运行,之后的方法一样同理可得。


(3)、个人小结

this.show(O)>super.show(O)>this.show((super)O)>super.show((super)O)