码迷,mamicode.com
首页 > 编程语言 > 详细

java多态讲解

时间:2015-03-04 01:07:51      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:多态   java   父类引用   编译期   运行期   

JAVA多态

一、相关的类结构

class A ...{  //create by danielinbiti
         public String show(D obj)...{  
                return ("A and D");  
         }   
         public String show(A obj)...{  
                return ("A and A");  
         }   
}   
class B extends A...{  
         public String show(B obj)...{  
                return ("B and B");  
         }  
         public String show(A obj)...{  
                return ("B and A");  
         }   
}  
class C extends B...{}  																
class D extends B...{}

二、测试运行

        A a1 = new A();  
        A a2 = new B();  
        B b = new B();  
        C c = new C();   
        D d = new D();   
        System.out.println(a1.show(b));   ①  
        System.out.println(a1.show(c));   ②  
        System.out.println(a1.show(d));   ③  
        System.out.println(a2.show(b));   ④  
        System.out.println(a2.show(c));   ⑤  
        System.out.println(a2.show(d));   ⑥  
        System.out.println(b.show(b));    ⑦  
        System.out.println(b.show(c));    ⑧  
        System.out.println(b.show(d));    ⑨
三、运行结果

①   A and A
②   A and A
③   A and D
④   B and A
⑤   B and A
⑥   A and D
⑦   B and B
⑧   B and B
⑨   A and D

四、总结

以A a2=new B()为例。

1、a2只能访问A的信息(指的是编译期编译器只知道a2是A类型,不知道a2具体子类对象,只有运行期才知道指向什么对象),而子类重写的方法,父类中也存在,即B重写的方法,A里也有(如果B里有但是A里没有的方法,a2也不能直接调用),所以a2可以访问,但是调用的时候(注意这里指的是运行期),a2实际指向的是B对象,所以调用的是B对象的同名同类型参数方法。所以a2.show(b)调用的是show(A obj),因为A引用不到show(B obj)。

注:编译期是编译器检查语法和类型,运行期是解析器解析伪代码为机器指令而执行,编译期编译器会检查a2的访问范围,也就是a2的访问不超过A的信息就不会出错,运行期解析器会解析方法的代码指令。

java多态讲解

标签:多态   java   父类引用   编译期   运行期   

原文地址:http://blog.csdn.net/danielinbiti/article/details/44047007

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!