- 代码层面理解
- 内存层面理解
Static修饰的内容主要有以下3种访问规则:
代码层面理解
- 看下面一段代码
package Test;
public class Student {
public String name;
public int age;
public String address;
public Student(){};
public void show (){
System.out.println("姓名:"+this.name +" 年龄:"+this.age +" 地址" + this.address);
}
}
以上是Student类中一段很常见的代码,其中this表示调用者的地址,表明现在的变量表示的是成员变量,可以避免和局部变量混淆
其实如果从代码的角度来说其实这是不合适的,为什么this作为调用者的地址不进行传参到函数中就可以随便使用了?其实在这里java把调用者的地址隐形得传递了,只是没有写在参数列表中
如上图所示,我们在方法中加上Student this我们的代码并不会报错,但是这个this我们在调用的时候不能手动复制,在调用的时候由JVM统一赋值
我们将方法改为静态方法:
可以发现代码在语法层面将会直接报错,说明java在设计的时候就不允许将this传入其中
内存层面的理解
我们的代码要先加载到内存中才会被执行,同样我们的程序在执行时需要先被加载,而static修饰的内容和非static修饰的内容执行顺序是有差异的
程序的加载是以类为单位进行的,我们的类是当被用到才会被加载,并且只会被加载一次。当我们的类被加载时static修饰的变量和方法会随着类的加载一同被加载到内存中,此时如果我们没有创建对象,我们的非static 修饰的内容是不存在的
在上面的图面中,当我们要使用Student类时,Student类的字节码文件会被加载到方法取中,并且static修饰的变量会被加载到内存中并被初始化,static修饰的方法也会被加载的内存中。当我们用类名调用method方法,method方法里面又调用name变量,此时我们还没有创建对象,所有并没有name,所有此时程序将会报错
对规则的解释:
1.静态方法在访问的时候可以没有对象,但是静态的变量和方法一定已经被加载到内存中了
2.当非静态方法访问的时候,对象和静态的方法和变量已经在内存中存在了
3.静态方法被调用的时候对象可能不存在