【发布时间】:2017-09-28 06:19:54
【问题描述】:
我从具有静态方法的类(B) 扩展了一个类(A),然后在其他类(C) 中创建类(A) 的实例,并且我能够访问 B 类的静态方法,为什么会这样发生?
A类:
public class NetworkUtils extends AbsClass {}
B类:
public class AbsClass {
static public void eat(){}
}
C类:
Networkutills network = new Networkutills();
network.eat(); //why should I access eat class method
【问题讨论】:
-
你为什么认为你不应该能够做到这一点?
-
静态方法是 public :任何类都可以调用这个方法。另见:stackoverflow.com/questions/10459487
-
因为你将 NetworkUtils 扩展到 AbsClass,这意味着 NetworkUtils 将继承 AbsClass 的所有属性,所以很明显你可以通过为 NetworkUtils 创建一个实例来访问 AbsClass 的所有方法
-
"但是静态成员可以通过类名而不是实例来访问" true,但不幸的是 Java 允许
instance.staticMethod(),因为在编译时这样的代码将被更改为ClassOfInstance.staticMethod()。许多人认为允许这种语法是一个糟糕的设计决策,因为它不仅没有帮助,反而让 Java 新手感到困惑,他们开始认为 staticMethod 可以在instance本身上调用(这是不正确的)。所以network.eat();会被编译成Networkutills.eat(),这段代码是正确的,原因重复解释。
标签: java oop inheritance static