Java多态,Java多态的深入学习

来源:互联网 发布:单片机几个p口的区别 编辑:程序博客网 时间:2024/06/05 14:32
public class TestAB {/** * @param args */public static void main(String[] args) {A a = new A();B b = new B();a.setS("[aa]");b.setS("[bb]");//把b强制转换为a,父类引用指向子类对象a = b;//b转换为A类型后,其属性s被隐藏,能看见的为A类型中的属性sSystem.out.println(a.s);//直接读取b的sSystem.out.println(b.s);//由于类B从类A继承,并重写了类A的getS方法,同时a是从b转换后得来(父类引用指向子类对象)所以,这里使用了java的多态System.out.println(a.getS());//直接调用b的方法getSSystem.out.println(b.getS());}}//定义类Aclass A{String s = "a";public void setS(String s){this.s = s;}public String getS(){return this.s;}}//定义类B从类A中继承,并重写其方法setS和方法getSclass B extends A{String s = "b";//重写方法setSpublic void setS(String s){this.s = s;}//重写方法getSpublic String getS(){return this.s;}}
这个小例子的答案是:a、[bb]、[bb]、[bb],为什么会是这个答案,很多人会认为第一个输出会是[bb],觉得b转换成A后赋给了a,a就具有了b的全部属性和方法,其实A是B的父类,当b转换成A类型后赋给a,类B中的属性s已经被隐藏起来,能看到的只有其父类中的属性s,所以应该为a,而第三个输出中,类B重写了类A中的getS方法,所以获得的是类B中的s,这里需要注意的是,类B中的属性s只是被隐藏了起来,依然存在于类B中,并没有丢失
原创粉丝点击