多态:成员变量和成员方法的多态性

1、成员方法的多态性

public class Polymorphism{
	public static void main(String[] agrs){
		BasePolymorphism b = new SubPolymorphism();
		b.method1();
	}
}

class BasePolymorphism{
	public BasePolymorphism(){
		//注意:此处调用的将是子类的method2方法
		this.method2();
	}

	public void method1(){
		System.out.println("BasePolymorphism method1");
		//注意:此处调用的将是子类的method2方法
		this.method2();
		//因为父类的method3方法是私有的,在子类中不可见,所以子类无法覆盖该方法。
		//即使子类中定义了同名方法,也只能算是重新定义了一个方法,该方法也不具有多态性
		//注意:此处调用的是父类的method3方法
		this.method3();
	}
	
	//此方法会被子类的同名方法覆盖
	public void method2(){
		System.out.println("BasePolymorphism method2");
	}
	
	private void method3(){
		System.out.println("BasePolymorphism method3");
	}
}

class SubPolymorphism extends BasePolymorphism{
	//此方法会覆盖父类中的同名方法
	public void method2(){
		System.out.println("SubPolymorphism method2");
	}
	
	//虽然该方法与父类中的方法完全相同,但由于父类中的该方法是私有的,所以此处的方法无法覆盖父类中的同名方法
	//该方法只是子类新定义的一个方法
	public void method3(){
		System.out.println("SubPolymorphism method3");
	}
}
/*
运行结果:
SubPolymorphism method2
BasePolymorphism method1
SubPolymorphism method2
BasePolymorphism method3
*/

/*
分析:
如果子类中的某个方法覆盖父类中的同名方法,那么即使是在父类中调用该同名方法,被调用的方法也是子类中的同名方法、而不是父类中的同名方法。
因此如果要在父类中调用将要被子类重写的方法时,必须格外小心。

父类中的私有方法在子类中是不可见的,所以子类无法覆盖父类中的私有方法。
即使子类定义了和父类的私有方法完全相同的方法,也不会覆盖父类中对应的私有方法,仅仅是在子类中定义了一个新方法。
*/

 

 

2、成员变量的多态性

与成员方法不同,成员变量不具有多态性。通过引用变量来访问它包含的成员变量时,系统总是试图访问它编译时类型所定义的成员变量,而不是它运行时类型所定义的成员变量。

猜你喜欢

转载自guoying252166655.iteye.com/blog/2101987
今日推荐