java - 阴影静态方法

标签 java static

我正在阅读有关隐藏静态方法的文章,但我无法理解一件事,即编译器如何选择要运行的方法。 假设我有 3 个类(class)。

public static class A {
        public static int test() {
            return 1;
        }
    }

    public static class B extends A {
        public static int test() {
            return 2;
        }
    }

    public static class C extends B {
        public static int test() {
            return 3;
        }
    }

显然,当我调用方法 A.test() B.test() C.test() 我会得到结果 1 2 3

但是如果我从实例中调用它(我知道不好的做法),那么当这段代码:

C c = new C();
System.out.println(c.test());

会像我期望的那样打印出 3,但是当我这样做的时候

B b = c;
System.out.println(b.test());

那么我的输出将是 2。 这让我感到惊讶,因为 b 被实例化为类 C 的对象。为什么要这样实现?

最佳答案

then my output will be 2. Which is surprising for me, as b was instantiate as object of class C. Any reason why it was implemented like that?

静态方法绑定(bind)到类型而不是实例。因此,对于静态方法,右侧部分无关紧要。

简而言之,静态成员属于类而不是实例

引用 JLS:15.12.4. Run-Time Evaluation of Method Invocation

关于java - 阴影静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32118306/

相关文章:

java - java api中的 Elasticsearch 查询

java - 我应该为简单地构建和返回数据结构的函数编写单元测试吗?

java - 从普通 c int[] 组成 jintArray 的 JNI 函数

java - 计算多个方法的行数,但返回单独的值而不是所有值的总和

java - 避免使用 freeMarker 模板创建的 html 表中的数据重复

Java基础: a static function without a name,或返回类型

安卓 : Static variable null on low memory

java - 构造对象时不能从静态上下文引用非静态变量 this

dynamic - 什么是具有动态范围和静态类型的编程语言?

java - 静态方法内存分配