java中的继承:为什么casted变量访问的解析方式不同于casted方法调用

xkrw2x1b  于 2021-06-26  发布在  Java
关注(0)|答案(0)|浏览(207)

这个问题在这里已经有答案了

转换为超类,并调用重写的方法(4个答案)
如果我将一个子类转换为它的超类,并调用一个在子类中被重写的方法,它执行的是被重写的方法还是原始方法(5个答案)
如果我完成了强制转换,为什么要重写从子类调用的方法(3个答案)
两天前关门了。
当涉及到强制转换时,继承是如何工作的(在java中)?casting与示例变量一样工作,但与方法不同。
给定以下代码;课堂上的评论 C 指编译器通过查看字节码可以检查的分辨率。

class A {
    String name;
    void test1() {
        System.out.println("ATest1 =" + this);
    }
    void test2() {
        System.out.println("ATest2 =" + this);
    }
}

class B extends A {
    String name;
    void test1() {
        System.out.println("BTest1 =" + this);
    }
    void test3() {
        System.out.println("BTest3 =" + this);
    }
}

class C {
    static public void main(String... args) {
        B b = new B();
        b.name = "Peter";      // Field B.name
        ((A)b).name = "Petra"; // Field A.name
        System.out.println(b.name);
        System.out.println(((A)b).name);
        b.test1();             // Method B.test1(b)
        ((A)b).test1();        // Method A.test1(b)
        b.test3();             // Method B.test3(b)
        b.test2();             // Method B.test2(b)
    }
}

你可以使用铸造来设置 name 在示例中 b 以及设置 name 在其附带的“虚拟”对象中,类的示例 A 可以这么说。
但是,如果涉及方法,则调用总是解析为示例 b 打电话 test1 在课堂上 B . 尽管事实上 ((A)b).test1() 方法 A.test1(b) (从jvm的Angular )被调用。
我不懂语义学。你能帮忙吗?
我猜是这样的 ((A)b).test1() 确认方法的存在 test1 在课堂上 A . 尽管如此,阶级 B 是调用方法时方法解析的起点,因为 ((A)b).getClass() ==> class B . 但为什么选角被“忽略”?你有java语言规范的指针吗?我不知道去哪儿找。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题