static 关键字

                    static 关键字

  你见过static关键字吗?肯定见过吧!main方法中就可以看见。当时就说过:被static修饰的成员变量是类变量,被static修饰的方法是类方法。类变量和类方法是属于类的,可以使用类名称直接调用。类变量和类方法比构造方法还要先加载。

  不论是静态的方法还是静态的变量都是属于类本身,它不属于任何一个对象。在类加载的时候类就为静态的方法和变量分配了空间,不需要等到实例化对象之后去使用对象操作,静态的方法被称为类方法,静态的变量被称为类变量,非静态的方法被称为实例(对象)方法,非静态的变量被称为实例(对象)变量。

代码
public class StaticDemo {
private static int count;// 静态成员变量
public static void fn() {// 使用static 定义一个静态的方法
System.out.println("static method");
count
= 3;
}

public static void main(String[] args) {
//StaticDemo.fn(); // 通常使用类名调用静态方法。
fn();// 直接调用静态方法
StaticDemo sd = new StaticDemo();
sd.fn();
// 使用对象调用静态方法。实质上还是通过类本身去调用
}
}
在非静态方法中可以使用静态变量和静态方法,而在静态方法中不可以直接使用非静态方法或者非静态变量,因为在加载类的时候非静态的方法还没有被初始化。例如:
代码
public class Test {
int x,y; // 在对象的内存空间中才能给x,y分配内存。
static double z = 3.1; // 类变量

public static void fun() {
z
+= 1;// 在静态的方法中使用静态的变量
System.out.println("z = " + z);
}

public static void fn(int x) { // 编译不通过
this.x = x;// this是输入对象的,不是属于类。对象创建之后才可见,现在还不可见。
}

public static void fn(int a,int b) { // 编译不通过
x = a;// 非静态成员变量
y = b;// 类未实例化之前,非静态成员变量还没有内存空间,无法保存值。
}

public void method() { // 编译通过
z = 3.1415; // 在非静态的方法中使用静态的变量。
fun(); // 在非静态的方法中使用静态的方法。
}

public static void main(String[] args) {
Test t
= new Test();
t.method();

fn(
1); // this指向的对象不明确。
fn(1,2); // 当去调用fn方法的时候,x,y还没有内存空间当然不能使用。
}
}

 

在一个静态的上下文中不能有非静态的this。

  所有的代码都是在内存模型当中去运行的。如果一个变量没有在这个内存当中分配空间,或者方法没有在内存当中分配代码区,那么都是不能调用的。

  java 静态方法内为什么不能声明静态变量?

    静态变量也叫类变量,和实例变量一样,是要在类体中声明的,它和实例变量都属于成员变量,而方法体内声明的变量属于局部变量,所以java静态方法内部能声明静态变量。

  静态的变量被所有的对象所共享,静态的方法被所有的对象所共享

代码
public class Test {
static double z = 3.14; // 静态的变量被所有的对象所共享

public static void fun() { // 静态的方法被所有的对象所共享
System.out.println("z = " + z);
}

public static void main(String[] args) {
Test t
= new Test();
t.z
= 3.141;

Test t2
= new Test();
t2.z
= 3.1415;

t.fun();
// 3.1415
}
}

 

posted @ 2010-12-20 22:45  meng72ndsc  阅读(184)  评论(0编辑  收藏  举报