为什么可以从子实例访问我的超类的静态方法?
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 {
}
}
我可以同意从父类的实例访问父类的静态方法。但是如果我实例化一个子类,访问父类的静态上下文会很奇怪。
PS
在实例上调用静态方法的优点是什么?
它被称为继承。子类继承父类的public
成员,包括静态
方法。重要的是静态
方法不绑定到任何实例。您可以这样做:
UtilImpl.fun();
AbstractUtil.fun();
就编译器而言,这是一回事。唯一的区别是您的代码创建对象,但这些与方法的调用方式无关(另外,正如@Dici在评论中所说,您也应该收到来自编译器的警告)。
在Java中,允许使用实例变量调用静态方法。JLS第8.4.3.2节对此进行了定义,引用了:
声明为静态的方法称为类方法。
类方法总是在不引用特定对象的情况下调用。
在这种情况下,Java实际上会丢弃您使用的实例并调用静态方法。
示例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。
我从一个有静态方法的类(B)扩展了一个类(a),然后在另一个类(C)中,我创建了一个类(a)的实例,并且我能够访问类B的静态方法。为什么会这样? A类: B类: C类:
本文向大家介绍我们可以从Java中的静态方法访问实例变量吗?,包括了我们可以从Java中的静态方法访问实例变量吗?的使用技巧和注意事项,需要的朋友参考一下 我们无法直接访问静态方法内的实例变量,因为静态方法只能访问静态变量或静态方法。 顾名思义,实例变量与类的实例相关。因此,直接从不依赖于任何特定实例的静态方法访问它是没有意义的。因此,要访问实例变量,我们必须具有要从中访问实例变量的类的实例。 例
我找不到任何解释原因的好消息:
假设我有一个基类(具有一个名为)的虚拟方法)和300个子类:每个子类都有一个静态方法,外加一个重写。(请不要问为什么;这是在一个生产软件中,已经给出了,不能为了更好的重用而更改设计。实际上,那些子类是由一个代码生成器生成的,但现在这已经不相关了。) 根据应用程序的不同执行,需要初始化的(小)子集。换句话说,有一些数据是特定的所有实例共同共享或访问的。显然,将这些实体定义为成员/方法(因为它们由的所
问题内容: 大家好!我有一个简单的问题。…为什么我可以从main方法中获得一个私有变量?我知道,我在包含类中,但这是主要的。我相信主体不是包含它的类的一部分……那么我不会去找私人成员,但是我可以……为什么?请帮助… thx 问题答案: Main是您的类的一部分,您已经在类中声明了它:) main不是您的对象的一部分,它不会是您从该类创建的对象的任何部分,但它仍然是该类的一部分。这对于任何静态函数都