为什么可以从子实例访问我的超类的静态方法?
public class Test {
public static void main(String[] args) {
new UtilImpl().fun();
new AbstractUtil() {}.fun();
}
static abstract class AbstractUtil {
public static void fun() {
System.out.println("Fun!");
}
}
static class UtilImpl extends AbstractUtil {
}
}
我可以同意从父类的实例访问父类的静态方法。但是,如果我实例化一个子类,那么访问父类的静态上下文很奇怪。
聚苯乙烯
在实例上调用静态方法有什么优势?
在Java中,允许使用实例变量调用静态方法。这在JLS的8.4.3.2节中定义,引用:
声明为静态的方法称为类方法。
始终在不引用特定对象的情况下调用类方法。
在这种情况下,Java实际上会丢弃您使用的实例并调用静态方法。
例15.12.4.1-1用以下方式表示这一点:
当计算目标引用然后由于调用模式为静态而将其丢弃时,将不检查该引用以查看其是否为空:
class Test1 { static void mountain() { System.out.println("Monadnock"); } static Test1 favorite(){ System.out.print("Mount "); return null; } public static void main(String[] args) { favorite().mountain(); } }
打印:
Mount Monadnock
这里favourite()返回null,但不会引发NullPointerException。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句