多态是如何产生的:

下面的代码完整阐述了多态的产生过程和其特性:

import static java.lang.System.*;
class BaseClass{
	public int book=6;
	public void base(){
		out.println("BaseClass类的base()方法!");
	}
	public void test(){
		out.println("BaseClass类的test()方法!");
	}
}

public class SubClass extends BaseClass{
	//-重写,但是类型不一样
	public String book="这是字符类型的book变量!";	

	public void sub(){
		out.println("SubClass类的sub()方法!");	
	}
		
	//-重写
	public void test(){
		out.println("SubClass类覆写BaseClass类的test()方法");
	}

	public static void main(String[] args){
		//-编译类型和运行类型完全一样,不存在多态
		BaseClass b=new BaseClass();
		out.println(b.book);
		b.base();
		b.test();

		//-编译类型和运行类型完全一样,不存在多态
		SubClass s=new SubClass();
		out.println(s.book);
		s.sub();
		s.test();

		//-编译类型和运行类型不一样,出现多态:
		//-编译类型为BaseClass类,运行类型为SubClass类
		BaseClass bs=new SubClass();
		//-变量在程序编译时,已经由编译类型确定,所以这里输出BaseClass 类中的book变量:6
		out.println(bs.book);
		//-方法的调用在程序编译时,由运行类型指定,所以这里调用的是SubClass类中继承自BaseClass类中的base()方法
		bs.base();
		//-方法的调用在程序编译时,由运行类型指定,所以这里调用的是SubClass类中覆写的base()方法
		bs.test();
		//-BaseClass类中不存在sub()方法,编译时就会报错,编译不通过
		//bs.sub();
	}
	
}

运行结果:

总结:

1、java引用变量有两种类型:编译时类型、运行时类型

2、编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象类型决定

3、如果编译时类型和运行时类型不一致,就出现了所谓的多态

如上代码所示,在声明bs变量的时候:

BaseClass bs:声明bs的类型为BaseClass类型

=new SubClass():赋给bs的对象类型为SubClass类型

所以 bs这个对象就存在多态!!!

3.1、变量:由编译类型决定

3.2、方法:编译阶段只能调用编译类型所具有的方法,运行时则执行运行类型所执行的方法

原文地址:https://www.cnblogs.com/baby-zhude/p/8035079.html