Java基础--多态的深入理解(附带有代码案例分析)

1. 定义:

Java应用变量有两个类型:一个是编译时类型,一个是运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就肯能出现所谓的多态。

2. 代码案例

2.1 父类

package com.zit;

public class Parent1 {
	public int book = 6;
	public void base() {
		System.out.println("父类的普通方法");
		
	}
	public void test() {
		System.out.println("父类的测试方法");
	}
}

2.2 子类

package com.zit;

public class Children1 extends Parent1 {
	public String book = "轻量级JavaEE企业应用实战";
			
	
	public void test() {
		System.out.println("子类的测试方法");
	}
	public void sub() {
		System.out.println("子类的普通方法");
	}
}

2.3 测试类

package com.zit;

public class Test {
	public static void main(String[] args) {
		//编译时类型是Parent1 所以运行时类型是Children1
		Parent1 d1 = new Children1();
		//此处调用父类的实例变量book
		System.out.println(d1.book);
		//此处调用父类的方法base()
		d1.base();
		//此处调用的是子类的方法test()
		d1.test();
	}
}

注意:

2.4 测试结果

3. 总结

     在上面的测试方法当中,创建了一个引用变量,d1,它的编译时类型是Parent1运行时类型是Children1,当调用该引用变量的test()方法(父类定义该方法,子类覆盖了该方法)时,实际执行的是子类Children类中覆盖后的test()方法,这就出现多态了。

     当一个子类对象直接赋给父类应用变量时,例如上面的,Parent1 d1 = new Children1(); 这个d1应用变量的编译时期类型是Parent1,而运行时类型Children1,当运行时调用该引用变量,其方法行为总是表现出子类方法的行为特征,而不是父类方法的行为特征,这就可能出现:相同类型的变量、调用同一个方法时呈现出多种不同的行为特征,这就是多态。

     与方法不同的是,对象的示例变量不具备多态性。不如上面的d1引用变量,程序中输出它的book实例变量时,并不是输出Children1类里面定义的实例变量,而是输出Parent1类的示例变量。

注意1:

引用变量在编译阶段只能调用其编译时类型所具有的方法,但运行时则执行它运行时类型所具有的方法。因此,编写Java代码时,引用变量只能调用声明该变量时所用类里包含的方法。

注意2:

通过引用变量来访问其包含的实例变量时,系统总是试图访问它编译时类型所定义的成员变量、而不是它运行时类型所定义的成员变量。

猜你喜欢

转载自blog.csdn.net/qq_37306041/article/details/81091493
今日推荐