跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 请问 Java 中的“编译期可知,运行期不变”的父类方法是什么?
未分類
22 9 月 2020

请问 Java 中的“编译期可知,运行期不变”的父类方法是什么?

请问 Java 中的“编译期可知,运行期不变”的父类方法是什么?

資深大佬 : Newyorkcity 4

方法在程序真正运行之前就有一个可确定的调用版本,并且这个方法的调用版本在运行期是不可改变的。换句话说,调用目标在程序代码写好、编译器进行编译那一刻就已经确定下来。这类方法的调用被称为解析( Resolution )。

只要能被 invokestatic 和 invokespecial 指令调用的方法,都可以在解析阶段中确定唯一的调用版本,Java 语言里符合这个条件的方法共有静态方法、私有方法、实例构造器、父类方法 4 种,再加上被 final 修饰的方法(尽管它使用 invokevirtual 指令调用),这 5 种方法调用会在类加载的时候就可以把符号引用解析为该方法的直接引用。这些方法统称为“非虚方法”( Non-Virtual Method ),与之相反,其他方法就被称为“虚方法”( Virtual Method )。

以上内容出自周志明先生的《深入 JVM (第三版)》,结合两段内容可以推论『父类方法是在程序代码写好、编译器进行编译那一刻就已经确定下来的』,我本来是从字面上理解就是父类中的方法,但父类中的方法应该不具备这么腰椎盘突出的性质吧。。。

谢谢

大佬有話說 (4)

  • 資深大佬 : codehz

    所有能写出来的方法都是编译期可知,运行期不变啊,除非你用 asm 库动态创建,但是创建的过程逻辑上也是编译期(
    你在不绕过 jvm 的情况下能写出运行期可变的 java 方法吗(

  • 主 資深大佬 : Newyorkcity

    @codehz

    “`java
    import java.util.Random;

    public class Main {
    public static void main(String[] args) {
    final Random random = new Random();
    Human person = random.nextBoolean() ? new Man() : new Woman();
    person.say();
    }

    static abstract class Human {
    abstract void say();
    }

    static class Man extends Human {
    @Override
    void say() {
    System.out.println(“I am male.”);
    }
    }

    static class Woman extends Human {
    @Override
    void say() {
    System.out.println(“I am female”);
    }
    }
    }
    “`

  • 資深大佬 : codehz

    @Newyorkcity 哦,我理解错了,看题目我以为是类的问题

  • 資深大佬 : geelaw

    父类方法是指用 super 调用的基类中方法(的版本)。

    例如
    class B { public void Foo() { } }
    class D extends B { @Override public void Foo() { super.Foo(); } }
    这里面 super.Foo 调用 B.Foo 是编译时决定的。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具