静态变量、静态方法、静态代码块、非静态变量及非静态方法的简单介绍

来源:互联网 发布:js 清空数组 编辑:程序博客网 时间:2024/06/18 00:16

静态变量、静态方法、静态代码块、非静态变量及非静态方法的简单介绍

静态变量

静态变量是类中的一种特殊变量,他在运行是可以说是从属于类,也就是说由该类定义生成的所有对象共用同一个静态变量,内存中只有一个版本。这对于要求在程序运行过程中,只有一个对象副本存于内存非常重要,如在实现单例模式时,为了实现只有一个类对象存于内存中,我们把内对象定义为一个静态变量;为了确保这个执行过程中,只有一个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.

 

原创粉丝点击