当前位置: 首页 > 面试题库 >

有哪些规则指示Java中静态变量的继承?

李辉
2023-03-14
问题内容

我有一个类Super

public class Super {
    public static String foo = "foo";
}

我也有另一个类,Sub扩展了Super

public class Sub extends Super {
    static {
        foo = "bar";
    }

    public static void main (String[] args) {
        System.out.println(Super.foo);
    }
}

当我运行它时,它会打印出来bar
我的第三(也是最后一个)课是Testing

public class Testing {
    public static void main (String[] args) {
        System.out.println(Super.foo);
        System.out.println(Sub.foo);
        System.out.println(Super.foo);
    }
}

打印:

foo
foo
foo

我不明白为什么不同的内容foo取决于您从哪个类访问它。谁能解释?


问题答案:

我不明白为什么foo的内容会根据您从哪个类访问它而变化。

基本上,这是类型初始化的问题。的值foo设置为"bar"when
Sub初始化。但是,在您的Testing类中,对的引用Sub.foo实际上已编译为对的引用Super.foo,因此它不会最终初始化Sub,因此foo永远不会成为"bar"

如果您将测试代码更改为:

public class Testing {
    public static void main (String[] args) {
        Sub.main(args);
        System.out.println(Super.foo);
        System.out.println(Sub.foo);
        System.out.println(Super.foo);
    }
}

然后它将打印出“ bar”四次,因为第一条语句将被强制Sub初始化,这将更改的值foo。根本不关从哪里访问它。

请注意,这不仅与类 加载 有关,还与类 初始化有关 。无需初始化即可加载类。例如:

public class Testing {
    public static void main (String[] args) {
        System.out.println(Super.foo);
        System.out.println(Sub.class);
        System.out.println(Super.foo);
    }
}

仍然会打印两次“ foo”,表明Sub尚未初始化-但肯定已 加载 ,例如,如果您Sub.class在运行文件之前删除文件,则该程序将失败。



 类似资料:
  • 问题内容: 我想要以下设置: 这在Java中可能吗?怎么样?如果可以避免的话,我宁愿不使用实例变量/方法。 谢谢! 编辑: 常量是数据库表的名称。每个子对象都是一个微型ORM。 问题答案: 您无法完全按照自己的意愿去做。也许可以接受的折衷方案是:

  • 问题内容: 根据Java,静态变量可以通过类名访问,但是即使Java不建议使用静态变量,类对象也可以访问它们,并且给出相同的答案。 我知道该变量只有一个副本,并且所有对象和其他事物的值都相同。Java为什么建议使用类名而不是类对象? 问题答案: 因为可能会造成混淆!静态成员上没有动态调度。 看一下这个令人困惑的代码:(可能是语法错误;我的Java生锈了) 看起来很混乱,因为方法似乎是多态的,所以输

  • 问题内容: 例如: 这些变量将在Java,堆或堆栈存储器中存储在哪里?它们如何存储? 问题答案: 静态方法(实际上是所有方法)以及静态变量都存储在PermGen堆的部分中,因为它们是反射数据(与类相关的数据,而不与实例相关的数据)的一部分。 更新说明: 请注意,只有变量及其技术值(原始或引用)存储在空间中。 如果你的静态变量是对对象的引用,则对象本身存储在堆的常规部分(青年/旧世代或幸存者空间)中

  • 问题内容: 我已经读过1000多个位置,这些位置不继承静态变量。但是,这段代码如何正常工作? Parent.java Child.java 此代码显示“父母”。 还阅读了一些隐藏数据的概念。 Parent.java Child.java 现在输出为“ Child”。 那么这是否意味着 静态变量被继承,但是它们遵循数据隐藏的概念 ? 问题答案: 请查看oracle的文档:http : //docs.

  • 问题内容: 我正在使用一些静态方法和字段进行保存状态序列化。我可能已经发誓,尽管序列化和static造成了混乱。我应该使所有静电瞬变吗?并扩大通话会恢复正常的静态吗? 问题答案: s是隐式的,因此您不需要这样声明它们。 序列化用于序列化 实例 ,而不是 类 。 字段(方法是不相关的,因为它们是类定义的一部分,所以它们不被序列化)将被重新初始化为加载类时它们设置的任何值。 如果您具有可变字段,则对该

  • 如果继承了方法,并且它需要一些私有变量,那么这也必须在中提供,因为我现在正在中调用? 编辑:对于那些说将调用父类方法的人,我发现只有创建的对象,而没有单独的对象一个用于子类,一个用于父类。这里