静态变量、静态方法、静态代码块、非静态变量及非静态方法的简单介绍
静态变量
静态变量是类中的一种特殊变量,他在运行是可以说是从属于类,也就是说由该类定义生成的所有对象共用同一个静态变量,内存中只有一个版本。这对于要求在程序运行过程中,只有一个对象副本存于内存非常重要,如在实现单例模式时,为了实现只有一个类对象存于内存中,我们把内对象定义为一个静态变量;为了确保这个执行过程中,只有一个Connection对象村与内存中,我们把Connection定义为类静态变量。
静态代码块
静态代码块是以变量static表示的一段代码块,他是在第一次创建该类对象或第一次调用该类静态方法时执行,整个程序运行过程中最多执行一次。
静态方法
静态方法跟静态变量有点类似,也可以说是从属于类的方法,不用定义类实例对象就可以通过类名调用该方法。因此,我们也很容易知道,静态方法只能操作类的静态成员(包括静态变量和静态方法)或者其自己定义的内部成员。
非静态变量
非静态变量是属于特定类实例对象的,每个对象都有一个自己的副本。区别于静态变量的所有对象共用一个副本
非静态方法
非静态方法也可以说是属于对象的,只有类定义的对象才可以调用它,非静态方法可以操作静态变量,非静态变量及静态方法。
为了更好的理解以上内容,我将会给出一个实例程序,分析其在内存中的相关情况:
public class ClassA {
private int a;
private static int sa;
static
{
System.out.println("ClassA中的静态代码块开始");
sa=11;
System.out.println("ClassA中的静态代码块结束");
}
public ClassA()
{
System.out.println("ClassA中的构造函数开始");
a=1;
sa=10;
System.out.println("ClassA中的构造函数结束");
}
public void nonStaticPrintA()
{
System.out.println("ClassA中的非静态方法开始");
System.out.println("非静态变量a:"+a+"n静态变量sa:"+sa);
System.out.println("ClassA中的非静态方法结束");
}
public void staticPrintA()
{
System.out.println("ClassA中的静态方法开始");
System.out.println("不能调用非静态变量或非静态方法n静态变量sa:"+sa);
System.out.println("ClassA中的非静态方法结束");
}
}
public class ClassB extends ClassA {
private int b;
private static int sb;
static {
System.out.println("ClassB中的静态代码块开始");
sb = 111;
System.out.println("ClassB中的静态代码块结束");
}
public ClassB() {
System.out.println("ClassB中的构造函数开始");
b = 1;
sb = 10;
System.out.println("ClassB中的构造函数结束");
}
public void nonStaticPrintB() {
System.out.println("ClassB中的非静态方法开始");
System.out.println("非静态变量b:" + b + "n静态变量sb:" + sb);
System.out.println("ClassB中的非静态方法结束");
}
public void staticPrintB() {
System.out.println("ClassB中的静态方法开始");
System.out.println("不能调用非静态变量或非静态方法n静态变量sb:" + sb);
System.out.println("ClassB中的非静态方法结束");
}
}
public class Main {
public static void main(String[] args) {
// TODO code application logic here
ClassA a=new ClassA();
//ClassB b=new ClassB();
}
}
结果1
public class Main {
public static void main(String[] args) {
// TODO code application logic here
//ClassA a=new ClassA();
ClassB b=new ClassB();
}
}
结果2
public class Main {
public static void main(String[] args) {
// TODO code application logic here
ClassA a=new ClassA();
ClassB b=new ClassB();
}
}
结果3
总结:
1. 调用类构造函数创建对象执行顺序:父类静态代码块->子类静态代码块->父类构造函数->子类构造函数
2. 静态代码块在整个程序执行过程中最多执行一次。如果按一般情况需要执行的静态代码块,但是它已经执行了,就不用在执行,具体参考结果2和结果3.
这几个可以在一起总结的看一下.希望对你有帮助. |