在学习Java的过程中,遇到了一些关于static的问题,在这里做个简单整理。
问题一:
假设 A 类有如下定义,设 a 是 A 类的一个实例,下列语句调用哪个是错误的?()
public class A
{
public int i;
static String s;
void method1(){}
static void method2(){}
}
A. System.out.println(a.i);
B. a.method1();
C. A.method1();
D. A.method2();
静态成员和静态方法,可以直接通过类名进行调用;其他的成员和方法则需要进行实例化成对象之后,通过对象来调用。
因此答案为C。
问题二:
class B extends Object
{
static
{
System.out.println("Load B");
}
public B()
{
System.out.println("Create B");
}
}
class A extends B
{
static
{
System.out.println("Load A");
}
public A()
{
System.out.println("Create A");
}
}
public class Testclass
{
public static void main(String[] args)
{
new A();
}
}
执行顺序:静态代码块–>构造代码块–>构造方法
父类静态代码块–>子类静态代码块–>父类构造代码块–>父类构造方法–>子类构造代码块–>子类构造方法
因此程序运行结果为Load B -> Load A ->Create B ->Create A。
问题三:
public class B
{
public static B t1 = new B();
public static B t2 = new B();
{
System.out.println("构造块");
}
static
{
System.out.println("静态块");
}
public static void main(String[] args)
{
B t = new B();
}
}
静态域分为静态变量、静态方法和静态块,其中需要初始化的是静态变量和静态块,而它们两个的初始化顺序是由它们的位置决定。在本题这个类B中,首先初始化静态变量t1,意味着已经加载了B的静态域的一部分,此时不能再加载另一个静态域,否则属于重复加载,故这里不会执行静态块中的内容,只执行构造块和构造方法(空),t2同理。静态变量初始化后执行静态块中的内容,即继续加载静态域。最后执行main方法,new一个B对象,再执行一次构造块中的内容。
因此运行结果为构造块 构造块 静态块 构造块。