Java 关于静态块的查询

Java 关于静态块的查询,java,Java,关于这种情况,我有一个问题 我有两门课 2个不同包装内的A类和B类,如下所示 Package test1 // first Package public class B { public static int q = 10; // having one static variable static { system.out.println ("test")// One static block which is printing something } } 第二包内 Package test

关于这种情况,我有一个问题

我有两门课 2个不同包装内的A类和B类,如下所示

Package test1 // first Package
public class B
{
public static int q = 10; // having one static variable
static
{
system.out.println ("test")// One static block which is printing something
}
}
第二包内

Package test   
import test1.B  // Importing class B from Package test1
public class A
{
int c = B.q // reading the value q from class B
}
因此,在本例中,当我执行类A时,将执行类B中的静态块

静态{system.out.println(“测试”)}


将执行或不执行。

一旦类加载到虚拟机中,静态初始值设定项块将立即执行。您的代码正在访问类
B
中的静态字段,这将导致加载该类并执行静态初始值设定项


A
是否扩展类
B
并不重要。

根据,当JVM加载类时,将执行静态初始值设定项。因此,这意味着,在您的情况下,当您获得一个类的实例时,它无疑将被执行。

请花时间格式化您的代码-如果没有缩进,阅读非常困难。接下来,您可以非常轻松地测试您的问题-只需运行该代码(在您修复了无法使用这些包语句编译的事实之后…)有什么原因不能这样做吗?@user2256009一旦您的
B
类加载到JVM中,静态块就会被执行。老实说,我怀疑您运行的代码并不完全相同。请注意,在声明
q
之前添加
final
,将产生很大的差异。您肯定没有运行发布的代码,因为它不会编译……这假设类B将被加载。在不了解更多代码的情况下,不清楚是否会发生这种情况。是的,您必须获得类A的实例,但据说,将使用类A,假设这意味着它将被实例化。我刚刚详细说明了我的答案。谢谢。在创建类A的实例之前,不需要加载类B。OP显然没有向我们展示所有的代码,所以根本不清楚是否会加载类B(或者是类A)。在这种情况下,只有在创建A的实例时才会加载类B,因为B类用于设置类的非静态memer。