对Static访问规则的理解

  • 代码层面理解
  • 内存层面理解

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.静态方法被调用的时候对象可能不存在

posted @ 2023-02-25 21:12  一往而深,  阅读(37)  评论(0编辑  收藏  举报