登录

去注册

登录

注册

去登录

  • 扫码关注公众号
  • 发送“我爱安卓
  • 即可获取验证码

注册

解锁回答区域

  • 扫码关注公众号
  • 发送“我爱安卓

若你登陆,将永久解锁;
若未登录,仅本机解锁。

解锁回答区域

获取注册验证码

  • 扫码关注公众号
  • 发送“我爱安卓
  • 即可获取验证码

每日一问 | 当Unsafe遇上final,超神奇的事情发生了?

xiaoyang   2020-11-02 00:16   收藏

先来看一段代码:

final class A {
    String selfIntroduction() {
        return "I'm A";
    }
}

class B {
    String selfIntroduction() {
        return "I'm B";
    }
}

class Test {
    public final A a = new A();
}

问题来了:
1. Test.a能被替换吗?

2. Test.a能被替换成B对象的实例吗?

3. 如果问题2成立,在成功替换对象之后,调用Test.a.selfIntroduction方法,返回的是什么? 为什么会这样?

把代码稍微改一下:

final class A {
    String selfIntroduction = "I'm A";

    String selfIntroduction() {
        return selfIntroduction;
    }
}

class B {
    String selfIntroduction = "I'm B";

    String selfIntroduction() {
        return selfIntroduction;
    }
}

class Test {
    public final A a = new A();
}

4. 在成功替换对象之后,调用Test.a.selfIntroduction方法,返回的是什么? 为什么?

再把代码改一下:

final class A {
    String selfIntroduction = "I'm A";

    String selfIntroduction() {
        return selfIntroduction;
    }
}

class B {
    String selfIntroduction = "I'm B";
}

class Test {
    public final A a = new A();
}

5. 在成功替换对象之后,调用Test.a.selfIntroduction方法,会报错吗? 为什么?

继续改一下代码:

final class A {
    String selfIntroduction = "I'm A";

    String selfIntroduction() {
        return selfIntroduction;
    }
}

class B {
    String fakeSelfIntroduction = "I'm fake B";
    String selfIntroduction = "I'm B";
}

class Test {
    public final A a = new A();
}

6. 在成功替换对象之后,调用Test.a.selfIntroduction方法,会报错吗? 如果不会报错,返回值是什么? 为什么会这样?

再改一次代码吧:

final class A {
    String selfIntroduction = "I'm A";

    String selfIntroduction() {
        return selfIntroduction;
    }
}

class B {
    int i = 1;
    String fakeSelfIntroduction = "I'm Fake B";
    String selfIntroduction = "I'm B";
}

class Test {
    public final A a = new A();
}

7. 在成功替换对象之后,调用Test.a.selfIntroduction方法,会报错吗? 为什么?

本问题来自于:@陈小缘 的提问,提问入口:每日一问 问答征集,欢迎大家踊跃提问。

删除留言

确认删除留言,会导致相关评论丢失?

取消 确定