Java 关于静态块的查询
关于这种情况,我有一个问题 我有两门课 2个不同包装内的A类和B类,如下所示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
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。