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

具有继承的静态块的行为

施晗日
2023-03-14
问题内容

我正在尝试使用像这样的静态块:

我有一个叫做 Base.java

public class Base {

    static public int myVar;

}

和派生类Derived.java

public class Derived extends Base {

    static
    {
        Base.myVar = 10;
    }
}

我的main功能是这样的:

public static void main(String[] args)  {
    System.out.println(Derived.myVar);
    System.out.println(Base.myVar);
}

0 0按我的预期打印输出10 0。有人可以解释这种行为吗?另外,如果我希望派生类为静态变量设置值,该如何实现?


问题答案:

我认为。您不调用任何Derived属性(myVar属于Base,不属于Derived)。而且Java没有从运行静态块Derived。如果向其中添加一些静态字段Derived并对其进行访问,则Java将执行所有静态块。

class Base {

    static public int myVar;

}


class Derived extends Base {

    static public int myVar2;

    static
    {
        Base.myVar = 10;
    }
}


public class Main {
    public static void main( String[] args ) throws Exception {
        System.out.println(Derived.myVar2);
        System.out.println(Base.myVar);
    }
}

根据Java规范,当类初始化时(并执行了静态块):

12.4.1何时发生初始化在以下任何一种首次出现之前,将立即初始化类或接口类型T:

•T是一个类,并创建T的实例
•T是一个类,并调用T声明的静态方法。
•分配了由T声明的静态字段。
•使用T声明的静态字段,并且该字段不是常量变量(第4.12.4节)。
•T是顶级类(第7.6节),并执行词法嵌套在T中的断言语句(第14.10节)(第8.1.3节)。




 类似资料:
  • 问题内容: 如果我们运行派生类,它将打印派生类和父类。是否有任何方法可以防止静态块的继承? // Class 1 // Class2 基本上我在父类中有一些方法要继承,但不希望实例化派生类时发生在父静态块中的处理。有没有办法做到这一点,否则我将不得不复制代码? 问题答案: 没有。 你不能这样做 。 静态的initialzier块不会被继承。 由于基类扩展了超类,因此在加载类时将执行静态块,即使超类

  • 问题内容: 我不太明白为什么可以在Java中继承静态方法? 继承就像从基类继承,而Static属于Class而不是Object。 那么,如果静态仅属于该类,为什么它会滴入派生类呢?它不应该只与定义它的类一起使用吗? 继承静态方法是一种好的编程习惯吗? 问题答案: 在Java中,静态方法不是 继承的 (或正确的词被 覆盖 ),但可以 隐藏 。 这里最大的不同是它们不像对象方法那样经受多态性。 运行时

  • 问题内容: 假设我有以下课程: 以及这两个子类: 和 我的问题是这两个子类从父类共享相同的静态curID成员,而不是拥有不同的成员。 所以,如果我这样做: r1,r2,r3的ID为0,1,2,而t1,t2,t3的ID为3,4,5。除了这些,我希望t1,t2,t3的值分别为0、1、2,即使用curID静态变量的另一个副本。 这可能吗?如何? 问题答案: 正如其他人已经写过的,静态成员已绑定到该类,因

  • 我在某处读到: 如果静态同步方法位于不同的类中,则一个线程可以在每个类的静态同步方法中执行。每个类一个线程,无论它调用哪个静态同步方法。 假设我有以下类层次结构: 1)如果我有下面两个函数调用: 据我所知,它们不应该相互阻塞,并且两者可以同时执行。因为调用是用不同的类进行的。 2)但是,如果我有以下两个函数调用: 他们应该被对方屏蔽,因为他们被称为同一个班级。对吗? 还是还有别的原因?

  • 假设我有以下课程: 这两个子类: 和 我的问题是,这两个子类共享来自父类的同一个静态curID成员,而不是拥有不同的成员。 因此,如果我这样做: r1,r2,r3的ID是0,1,2,t1,t2,t3的ID是3,4,5。而不是这些我希望t1,t2,t3有值0,1,2,即使用另一个复制的curID静态变量。 这有可能吗?怎么做?

  • 你更喜欢/建议哪一个?