欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-22 08:37:21
...

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、成员变量的多态性

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