为什么可以从子实例访问我的超类的静态方法?
error: 2014
我同意从父类的实例访问父类的静态方法。但是如果我实例化一个子类,那么访问父类的静态上下文是很奇怪的。
PS 的
在实例上调用静态方法有什么好处?
答案 0 :(得分:3)
它被称为继承。子类继承父类的public
个成员,包括static
个方法。重要的是static
方法没有绑定到任何实例。你可以这么做:
UtilImpl.fun();
AbstractUtil.fun();
就编译器而言,它是一回事。唯一的区别是你的代码创建了对象,但这些对象与调用方法的方式无关(加上@Dici在评论中说你也应该从编译器那里得到警告)。
答案 1 :(得分:3)
在Java中,允许使用实例变量调用静态方法。这在JLS section 8.4.3.2中定义,引用:
声明为static的方法称为类方法。
始终在不引用特定对象的情况下调用类方法。
在这种情况下,Java实际上会丢弃您使用的实例并调用静态方法。
Example 15.12.4.1-1通过以下方式表达:
计算目标引用然后因为该目标而被丢弃 调用模式是静态的,不检查引用 是否为null:
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
这里的favorite()返回null,但没有抛出NullPointerException。