多态是如何产生的:
下面的代码完整阐述了多态的产生过程和其特性:
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、方法:编译阶段只能调用编译类型所具有的方法,运行时则执行运行类型所执行的方法
热心技术,并兼吃喝,偶谈风月,不言国事.