首页 > 代码库 > Java语言的多态性

Java语言的多态性

 

用简单的话来描述Java:编译类型与运行类型不一致的时候就会出现多态!

下面一段代码可以用来描述Java多态

class BaseClass{
	public String flag="父类的flag";
	public BaseClass(){
		System.out.println("父类无参构造函数被调用");
	}
	public void base(){
		System.out.println("父类的base方法");
	}
	public void test(){
		System.out.println("父类的test方法");
	}
}
class SubClass extends BaseClass{
	public String flag="子类的flag";
	public String flag2="子类的flag2";
	public SubClass(){
		System.out.println("子类无参构造函数");
	}
	public void test(){
		System.out.println("子类的test方法");
	}
	public void exam(){
		System.out.println("子类的exam方法");
	}
}

public class Test{
	public static void main(String[] args){
		BaseClass bc=new BaseClass();
		System.out.println(bc.flag);
		bc.test();
//		输出:
//		父类无参构造函数被调用
//		父类的flag
//		父类的test方法
		
		SubClass sc=new SubClass();
		System.out.println(sc.flag);
		sc.test();
		sc.exam();
//		输出:
//		父类无参构造函数被调用
//		子类的flag
//		子类无参构造函数
//		子类的test方法
//		子类的exam方法
		
		BaseClass X=new SubClass();
		System.out.println(X.flag);
//		System.out.println(X.flag2);//错误
		X.base();
		X.test();
//		X.exam();//报错	没有为类型 BaseClass 定义方法 exam()
//		输出:
//		父类无参构造函数被调用
//		子类无参构造函数
//		父类的flag
//		父类的base方法
//		子类的test方法
	}
}

上面代码中,对象实例 X 的编译类型为BaseClass,运行类型为SubClass
在运行的时候

  一、实例对象可以调用的方法要满足
    1、该方法必须是父类中(即编译类型)包含的方法,子类(即运行类型)特有的方法(新添加的方法)不可以被调用。
    2、当调用方法时,表现出来的是子类方法的特征(如子类将父类中的方法改写了,则输出改变以后的内容),否则依旧输出父类原内容

  二、实例对象调用变量的原则
    
1、与上面第一条相同
    2、访问该变量的时候,访问的始终是父类的变量,而非子类的变量,与调用方法的第二点相反

 

Java语言的多态性