2015-09-08 55 views
-1

我有一个关于这个场景查询关于静态块

我有2个班 A类和B类内的2个不同的套餐如下的问题。

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(”内测试“)}

将被执行或不执行。

+0

请花时间格式化您的代码 - 如果没有缩进,确实很难阅读。 –

+2

接下来,您可以非常轻松地测试您的问题 - 只需运行该代码(在您已解决使用这些包语句编译不了的事实之后...)是否有任何理由不能这样做? –

+0

@ user2256009只要你的B类加载到JVM中,静态块就会被执行。 –

回答

3

只要类加载到虚拟机中,静态初始化块就会立即执行。您的代码正在访问类B中的一个静态字段,这会导致该类被加载并执行静态初始化程序。

A类是否延伸B类也没关系。

+0

在创建类A的实例之前,不需要加载B类。 OP显然没有向我们展示所有的代码,所以目前还不清楚B类是否会被加载(或者是A类)。 –

+0

在这种情况下,只有在创建A的实例时才会加载B类,因为B类用于设置A类的非静态对象。 – Stanislav

1

根据specification,当JVM加载Class时,将执行静态初始化程序。所以,这意味着,无论何时您获得A类实例,您的情况都会毫无疑问地执行。

+1

这假定B类将被加载。不知道更多关于代码的信息,目前还不清楚这是否会发生。 –

+0

是的,你必须得到一个类A的实例,但据说A类将被使用,假设它意味着它将被实例化。刚刚指定我的答案。谢谢。 – Stanislav