一、“自找麻烦”
如果父类有静态成员赋值或静态初始化块,执行静态成员赋值和静态初始化块。
如果类有静态成员赋值或静态初始化块,执行静态成员赋值和静态初始化块给类的成员赋予初值。如果构造函数中存在this()则执行。
运行截图如上图。
如果程序中的一个字段,既用了直接初始化,也用了静态初始化器,还用了构造器,这三种方法初始化字段先后次序是:
1、静态的部分在classLoader加载类的时候就会执行,静态块中不能引用非静态的变量(因为这些变量要通过实例化类才能创建)。也不存在静态的成员变量,跟后面的两个初始化有质的不同(后两个是初始化成员变量)。
2、定义变量时直接赋的值。
3.构造函数
二、当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。
例子:
class Old
{
static{
System.out.println("Old的静态初始化块");
}
{
System.out.println("Old的普通初始化块");
}
public Old()
{
System.out.println("Old的无参数的构造器");
}
}
class Young extends Old
{
static{
System.out.println("Young的静态初始化块");
}
{
System.out.println("Young的普通初始化块");
}
public Young()
{
System.out.println("Young的无参数的构造器");
}
public Young(String msg)
{
//通过this调用同一类中重载的构造器
this();
System.out.println("Mid的带参数构造器,其参数值:" + msg);
}
}
public class Test2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
new Young();
}
结果截图:
三、静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?
静态方法中不能直接访问同一类中的非静态成员,而必须先创建对象,再通过对象访问成员。
例子:public class Test3{
int j =5;
static int value;
public static void A()
{ System.out.println(value); }
public int B()
{
int x = 100;
return x;
}
public static void main(String args[]) {
Test3 a = new Test3();
value = a.B();
a.A();
}}
运行结果:100
四、使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?
class Number
{
static int shu;
public Number()
{
shu++;
}
int GetShu()
{
return shu;
}
}
public class NumberObject {
public static void main(String[] args) {
Number n1=new Number();
Number n2=new Number();
Number n3=new Number();
System.out.println("你已经创建了"+Number.shu+"个对象");
}
}