Java多态

来源:互联网 发布:win10网络图标不能运行 编辑:程序博客网 时间:2024/06/05 09:18
public class test {    public static void main(String args[]) {        A a = new A();        System.out.println("------------------");        B b = new B();        System.out.println("------------------");        A c = new B();        System.out.println("------------------");        System.out.println("a.a=:"+a.a+" b.a=:"+b.a+" c.a=:"+c.a);        System.out.println("------------------");        a.get();        b.get();        c.get();        System.out.println("------------------");        b = (B) c;        c.get();        b.get();}class A {    int a = 1;    A() {        System.out.println("构造A");    }    public void get() {        System.out.println("A中a=" + this.a);    }}class B extends A {    int a = 2;    B() {        System.out.println("构造B");    }    public void get() {        System.out.println("B中a=" + this.a);    }}

执行结果:

构造A------------------构造A构造B------------------构造A构造B------------------a.a=:1 b.a=:2 c.a=:1------------------A中a=1B中a=2B中a=2------------------B中a=2B中a=2

那么问题来了

一、A a = new B();是a的引用指向了b的空间,为什么会打印出a.a=1而在调用get方法后打印出的是b的结果
二、将a强制类型转换成b并将a的引用赋给b后,a,b指向同一块地址空间为什么打印出的a.a=1 而b.a=2

一、A a = new B();a的引用指向B的空间,a.a=1但是调用a.get()=2;当new B()时,调用继承自父类的构造方法 并创建了一个变量a=1,然后调用了自己的构造方法并重新创建了空间创建了自己的变量a=2,由debug模式可以看到实例a当中拥有两个a变量,A a取变量a的值时先从自己的变量当中找到1,调用get()方法时优先调用子类重写过的方法,执行子类的方法取到了子类当中自己的变量a=2;这里写图片描述
二、将a转型赋给b后,虽然指向同一地址,但是a,b类型不同.两个对象各自取到自己类型的变量,调用方法时a执行被重写的方法,b执行自己的方法取值为2;
三、由此,A a = new B();a的引用指向B的空间时,调用a对象被子类重写的方法时,会执行B当中的方法.