Java多态

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=1
B中a=2
B中a=2
------------------
B中a=2
B中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当中的方法.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值