static 关键字
static 关键字
你见过static关键字吗?肯定见过吧!main方法中就可以看见。当时就说过:被static修饰的成员变量是类变量,被static修饰的方法是类方法。类变量和类方法是属于类的,可以使用类名称直接调用。类变量和类方法比构造方法还要先加载。
不论是静态的方法还是静态的变量都是属于类本身,它不属于任何一个对象。在类加载的时候类就为静态的方法和变量分配了空间,不需要等到实例化对象之后去使用对象操作,静态的方法被称为类方法,静态的变量被称为类变量,非静态的方法被称为实例(对象)方法,非静态的变量被称为实例(对象)变量。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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(); // 使用对象调用静态方法。实质上还是通过类本身去调用
}
}
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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静态方法内部能声明静态变量。
静态的变量被所有的对象所共享,静态的方法被所有的对象所共享
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
}
}