java中的static

来源:互联网 发布:赵洪文国 知乎 编辑:程序博客网 时间:2024/05/29 17:25

1.静态对象和非静态对象的区别

                        静态对象                                    非静态对象     拥有属性:            是类共同拥有的                             是类各对象独立拥有的内存分配:          内存空间上是固定的                       在各自初始化的时候随机分配堆里的空间分配顺序:         先分配静态对象的空间                           后分配非静态对象的空间

注:静态对象在内存上是固定的,因此只要有用到该对象的引用都指向同一个位置,也就是一改都改;
访问static修饰的对象时很方便。直接用 类名.静态方法名 或者 类名.静态变量名
static final用来修饰成员变量和成员方法,可简单理解为“全局常量”。对于变量,表示一旦给值就不可修改;对于方法,表示不可覆盖。


2.静态方法

声明为static的方法只能调用其他static方法,访问static变量,并且不能以任何方式引用this 或super

public class TestNew {      static int a = 3;      static int b;      static void meth(int x){          System.out.println("x = "+x);          System.out.println("a = "+a);          System.out.println("b = "+b);      }      static {          System.out.println("static block initialized");          b = a*4;      }      public static void main(String[] args) {          // TODO Auto-generated method stub          meth(42);      }  }  

执行结果是:

static block initialized
x = 42
a = 3
b = 12
注意:

a.在静态方法里只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前
不用创建任何对象。

b.静态方法不能以任何方式引用this和super关键字,因为静态方法在使用前不用创建任何实例对象,当静态方法调用时,this所引用的对象根本没有产生(this关键字只能在方法内部使用,表示对“调用方法的那
个对象”的引用)。

c.静态变量是属于整个类的变量而不是属于某个对象的。注意不能把任何方法体内的变量声明为静态,例如: fun() { static int i=0;//非法。 }


3.静态内部类

静态内部类是指在一个类的内部,又定义了一个用static修饰的类。可以用C中的结构体内嵌结构体来理解。
A,首先,用内部类是因为内部类与所在外部类有一定的关系,往往只有该外部类调用此内部类。所以没有必要专门用一个Java文件存放这个类。
B,静态方法、静态成员变量。它唯一的作用就是随着类的加载(而不是随着对象的产生)而产生,以致可以用类名+静态成员名直接获得。这样静态内部类就可以理解了,它可以直接被用 外部类名+内部类名 获得。举例如下:
public class Build {
…………..
public static class VERSION {
…………….
public static final String RELEASE = getString(“ro.build.version.release”);
…………….
}
…………….
}
在外部可以直接通过Build.VERSION.RELEASE来访问。


4.静态块

public class StaticBlock {     static {         System.out.println("静态块");     }     {         System.out.println("构造块,在类中定义");     }     public StaticBlock() {         System.out.println("构造方法执行");     }     public static void main(String[] args) {         new StaticBlock();         new StaticBlock();     } }

执行结果:
静态块
构造块,在类中定义
构造方法执行
构造块,在类中定义
构造方法执行


结论:静态代码块是在类加载时自动执行的,非静态代码块是在创建对象时自动执行的代码,不创建对象不执行该类的非静态代码块。且执行顺序为静态代码块——非静态代码块—-构造函数。


参考原文:http://blog.csdn.net/zhandoushi1982/article/details/8453522

原创粉丝点击