关于Java中static的笔记
本文中更多的只是自己的一些总结,笔者也是刚学java不就,文中难免出现纰漏,还望大家多多指正。
class Base{
Base()
{
System.out.println("in Base()");
}
static int i = static_aux();
static void static_f1(){
System.out.println("int static_f1()");
}
static int static_aux(){
System.out.println("Initialize i");
return 1;
}
}
public class Test {
public static void main(String[] args){
Base b = new Base();
}
}
输出结果如下:
Initialize i
in Base()
在创建类对象的时候,类的静态变量会被最优先初始化,接着再是构造函数,静态函数没被初始化。
public class Test {
public static void main(String[] args){
Base.static_f1();
}
}
当只调用类的静态函数,输出结果如下:
Initialize i
int static_f1()
类的静态变量还是优先被调用,接着再是被调用的静态函数的调用,类不被初始化,因为没创建对象。
下面看在继承体系中static的表现
(静态函数是不会被继承的)
class Base{
Base()
{
System.out.println("In Base()");
}
static void static_f1(){
System.out.println("In Base static_f1()");
}
static int static_aux(){
System.out.println("In Base Initialize i");
return 1;
}
static int i = static_aux();
}
class Drived extends Base{
Drived()
{
System.out.println("in Drived()");
}
static int i = static_aux();
public static int static_aux(){
System.out.println("In Drived Initialize i");
return 1;
}
static void static_f1(){
System.out.println("In Drived static_f1()");
}
}
public class Test {
public static void main(String[] args){
Drived.static_f1();
// Drived d = new Drived();
}
}
上面的代码输出结果如下:
In Base Initialize i
In Drived Initialize i
In Drived static_f1()
现在的情况下,我们只调用子类的静态函数,父类的静态成员变量居然被初始化了。
当运行下面的代码
public class Test {
public static void main(String[] args){
// Drived.static_f1();
Drived d = new Drived();
}
}
运行的结果如下:
In Base Initialize i
In Drived Initialize i
In Base()
in Drived()
可以看出子类的静态成员变量的初始化优先级别高于父类的构造函数。
这部分的知识要可能看到JVM才能明白,现在就先总结几个小结论。
>
1.对于类的静态成员变量,在创建类对象和调用类的静态成员函数的时候(用到类的时候),会被初始化;静态成员函数只会在被调用时候初始化。
2. 在继承体系中,父类的静态成员变量初始化优先级别总是最高的,接着是子类的静态成员变量,最后才是构造函数。