JAVA静态域与静态方法

    技术2023-05-30  18

    先附上手敲的例子:

    class TestStatic{ public static void main(String[] args) { //不需要new一个S类对象,直接用"类名.方法名"或者"对象名.方法名"去调用。 System.out.println("调用S.getB():"+S.getB()); System.out.println("输出静态变量b:"+S.b); S s = new S(); //调用普通方法必须先new一个对象 System.out.println("调用s.getA_AND_B():"+s.getA_AND_B()); } /** * 构建静态内部类 */ static class S{ //定义一个普通变量 private int a; //定义一个静态变量 private static int b; static { //静态初始化器所在类第一次被使用时,静态初始化器首先被调用,而且仅此一次而已, // 以后不管这个类被使用多少次,静态初始化器都不会再被调用。常用于赋值。 b=10; //此处不能定义a=10;因为非静态域不能在静态初识化器中初始化。 } // 定义静态方法 public static int getB(){ //不能返回return a;静态方法只能调用静态变量 System.out.println("修改前b:"+b); b=12; return b+1; } //定义普通方法,在普通方法中可以访问b变量,而在静态变量中不能访问普通变量,只能访问静态变量。 public int getA_AND_B(){ a=9; return a+b; } } }

    解释:静态方法和静态数据成员会随着类的定义而被分配和装载入内存中,而非静态方法和非静态数据成员只有在类的对象创建时在对象的内存中才有这个方法的代码段。

    静态方法的使用场景:

    一个方法不需要访问对象状态,其所需参数都是通过显示参数提供。一个方法只需要访问类的静态域。(例如上面的S.getB())。

    总结:

    非静态方法既可以访问静态数据成员 又可以访问非静态数据成员,而静态方法只能访问静态数据成员。非静态方法既可以访问静态方法又可以访问非静态方法,而静态方法只能访问静态数据方法。static修饰的静态方法会随着类的定义而被分配和装载入内存中,编译器只为整个类创建了一个静态变量的副本,也就是只分配一个内存空间,虽然可能有多个实例,但这些实例共享该内存,特别值得注意的是,任何一个对象对静态数据成员的修改,都会影响其它对象。静态不能引用非静态这一特性,是由于静态的会随着类的定义而被分配和装载入内存中这一关键点决定的;如果静态引用了非静态的,根本无法从内存中找到非静态的代码段,势必会出错,这种做法是Java虚拟机决不允许的。
    Processed: 0.011, SQL: 8