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

考考你对java多态的理解

时间:2016-08-01 19:24:06      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:

请看如下代码, 如果你能不运行得出正确答案, 那你真的超过99%的java程序员了. [本人属于最大头的那部分]

public class A{    
    public String s = "A";    
    public void setS(String s){     
        this.s = s;     
    }     
    public String getS(){     
        return this.s;     
    }      
}    
    
public class B extends A{     
    public String s = "B";    
    public void setS(String s){     
        this.s = s;     
    }     
    public String getS(){     
        return this.s;     
    }    
    public static void main(String[] args){     
        A a = new A();     
        B b = new B();     
        a.setS("[AA]");     
        b.setS("[BB]");     
        a = b;    
        System.out.print(a.s);    
        System.out.print(b.s);     
        System.out.print(a.getS());     
        System.out.print(b.getS());     
        }    
}  

  

      输出的结果是多少呢? [AA][BB][AA][BB]或者[AA][BB][BB][BB],这两个答案你会选择其中哪个? 其实这两个答案都是错误的, 正确是: A[BB][AA][BB]. 这里考察的一个知识点是子类的引用指向了父类类型, 看你是否深入理解过.

     在java的继承里属性是不支持多态的,只有方法支持多态. 可能你会想方法不支持多态那么a.s那么会输出"[AA]"才对啊.其实当执行了a = b; 这条赋值语句后, a对象与他原来new出来的对象没有任何关系了.

     b对象在构造出来之前,jvm会先初始并生成一个b对象的父类实例也就是A类的对象,那么A对象的属性 s 当然就被默认初始化为"A"了. 执行a = b这条语句, a对象其实是指向了b对象的隐藏父类对象(就是b对象生成之前构造出的父类对象),我们就能理解为什么输出这个结果了. 那么方法调用输出的结果,自然是体现了java中的多态了后面三个结果都是"[BB]".

     [由于个人能力有限, 写的不准确的地方欢迎大家多多指正, 共同学习!]

     参考:http://blog.csdn.net/zdwzzu2006/article/details/5979886

考考你对java多态的理解

标签:

原文地址:http://www.cnblogs.com/water-melon/p/5726827.html

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