黑马程序员技术交流社区

标题: java中静态变量和静态方法 [打印本页]

作者: 陈郊    时间: 2012-9-26 08:43
标题: java中静态变量和静态方法
什么是静态方法和静态变量?
java中静态变量和静态方法分别有什么特点?
作者: 陈郊    时间: 2012-9-26 08:43
求解答!急!
作者: 汪小照    时间: 2012-9-26 08:54
java中的静态方与静态变量指的是用static修饰符来修饰的就是静态的。
静态方法不能访问非静态成员变量和方法。
非静态方法即可以访问静态成员变量和静态方法,也可以访问非静态的成员变量和方法。
这两句话就是学静态时必须掌握的两句话。
作者: 唐学松    时间: 2012-9-26 09:04
用static 修饰的变量和方法,称为静态变量和静态方法,
静态变量和方法,与类共存亡,

作者: 刘进朝    时间: 2012-9-26 09:12
静态变量、静态方法、静态代码块、非静态变量及非静态方法的简单介绍
静态变量
静态变量是类中的一种特殊变量,他在运行是可以说是从属于类,也就是说由该类定义生成的所有对象共用同一个静态变量,内存中只有一个版本。这对于要求在程序运行过程中,只有一个对象副本存于内存非常重要,如在实现单例模式时,为了实现只有一个类对象存于内存中,我们把内对象定义为一个静态变量;为了确保这个执行过程中,只有一个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.

这几个可以在一起总结的看一下.希望对你有帮助.
作者: 王雷    时间: 2012-9-26 09:36
java中的静态方与静态变量指的是用static修饰符来修饰的就是静态的。 静态方法不能访问非静态成员变量和方法。 非静态方法即可以访问静态成员变量和静态方法,也可以访问非静态的成员变量和方法。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2