本帖最后由 小狼 于 2013-8-23 22:23 编辑
1.JAVA引用变量有两个类型,一个是编译时类型,一个是运行时类型,编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋值给该变量的对象决定。如果编译时类型和运行时类型不一致,就可能出现所谓的多态。
2.相同类型的变量,调用同一个方法时呈现出多种不同的行为特征,这就是多态。 与方法不同的是,对象的Field则不具备多态性。
3.引用变量在编译时只能调用其编译时类型所具有的方法,但运行时则执行它运行时类型所具有的方法,因此,编写JAVA代码时,引用变量只能调用声明该变量时所用类里的方法,例如:Object p = new Person(); 4.代码定义了一个变量p,则这个p只能调用Object类的方法,而不能调用person类里定义的方法。 通过引用变量来访问其包含的实例Field时,系统会试图访问它编译时类型所定义的Field,而不是它运行时类型所定义的Field。 举例: - class BaseClass
- {
- public int book = 6;
- public void base()
- {
- System.out.println("父类的普通方法");
- }
- public void test()
- {
- System.out.println("父类的被覆盖的方法");
- }
- }
- public class SubClass extends BaseClass
- {
- //重新定义一个book实例Field隐藏父类的book实例Field
- public String book = "轻量级Java EE企业应用实战";
- public void test()
- {
- System.out.println("子类的覆盖父类的方法");
- }
- public void sub()
- {
- System.out.println("子类的普通方法");
- }
- public static void main(String[] args)
- {
- //下面编译时类型和运行时类型完全一样,因此不存在多态
- BaseClass bc = new BaseClass();
- //输出 6
- System.out.println(bc.book);
- //下面两次调用将执行BaseClass的方法
- bc.base();
- bc.test();
- //下面编译时类型和运行时类型完全一样,因此不存在多态
- SubClass sc = new SubClass();
- //输出"轻量级J2EE企业应用实战"
- System.out.println(sc.book);
- //下面调用将执行从父类继承到的base方法
- sc.base();
- //下面调用将执行从当前类的test方法
- sc.test();
- //下面编译时类型和运行时类型不一样,多态发生
- BaseClass ploymophicBc = new SubClass();
- //输出 6 —— 表明访问的是父类Field
- System.out.println(ploymophicBc.book);
- //下面调用将执行从父类继承到的base方法
- ploymophicBc.base();
- //下面调用将执行从当前类的test方法
- ploymophicBc.test();
- //因为ploymophicBc的编译类型是BaseClass,
- //BaseClass类没有提供sub方法,所以下面代码编译时会出现错误。
- //ploymophicBc.sub();
- }
- }
复制代码 |