【问题标题】:Can we call static method via a temp variable in java [closed]我们可以通过java中的临时变量调用静态方法吗?
【发布时间】:2021-01-06 04:24:13
【问题描述】:

我们可以通过临时变量调用静态方法吗?

有一个AA类

class AA {
    static void test() {
    }
}


class Main {
    public static void main(String[] args) {
        var  aa = AA;
        aa.test();   // Can we call static method via a  temp vairble ?
    }
}

为什么我有这个问题?因为我必须在重构工作中将所有实例调用样式修改为类静态样式。该方法之前是一个实例方法并使用局部变量来调用它,现在它变成了一个静态方法或类。所以我考虑是否有办法只修改变量。也许是幼稚。

直接,也许是这样,但不对。

Class<AA> aa = AA;
aa.test();   

我知道通过实例调用静态方法也不是好方法。

我们知道在 Java 8 中有一种方法可以引用函数。那么还有其他更多的元功能来引用文字类吗?

【问题讨论】:

  • 当然,试一试看看比问一个问题要容易...
  • @DanielMcLaury - 是和不是。 “试试看”方法的问题在于,如果您对正在发生的事情不够了解,您可能会选择错误的示例和/或从结果中得出错误的结论。 (但在这种情况下,“试试看”会向 OP 显示明显的编译错误。在示例中,AA 未声明为 Variable 的子类型。哎呀!)
  • @StephenC:我怀疑这里的 OP 实际上是指var 而不是Variable
  • 可能是。无论哪种方式,当前版本都不会编译。
  • 有一个预先存在的问题是同一件事:stackoverflow.com/q/32039657/217324

标签: java static-methods


【解决方案1】:

我们可以通过临时变量调用静态方法吗?

是的,你可以。 (以编译错误为模!)

但你可能没有做你认为你正在做的事情。这是一个坏主意

事实上,aa.test() 实际上与写 Variable.test() 的意思完全一样。也就是说,aa 的值及其实际类型在确定调用哪个方法以及调用该方法时完全忽略1

调用test() 方法的类在编译时被解析为Variable。 Java 不支持覆盖或动态调度 static 方法。

1 - JLS 声明计算引用的表达式已计算,但结果引用随后被丢弃。


通过实例变量调用static 方法是不好的风格,应该避免。

考虑一下:

class AA {
    static void test() {
        System.out.println("AA");
    }
}

class BB extends AA {
    static void test() {
        System.out.println("BB");
    }
}


class Main {
    public static void main(String[] args) {
        AA aa = new BB();
        aa.test();
    }
}

问:输出是什么?

A:输出为“AA”。

【讨论】:

  • 这个解释真的让我很受启发。 “调用 test() 方法的类在编译时解析为变量。Java 不支持覆盖或动态调度静态方法。”
【解决方案2】:

其实这不是从类中调用静态方法的方式。

如果我们有 AA 类:

class AA {
    public AA() {} 

    public static void test() {
        System.out.println("Test");
    }
}

我们可以这样调用test方法:

AA.test();

不建议像这样从它的实例中调用静态方法:

AA aa = new AA();
aa.test(); 

【讨论】:

    猜你喜欢
    • 2017-09-01
    • 1970-01-01
    • 2014-05-14
    • 2011-03-10
    • 2014-08-03
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多