前言:我认为这个问题本身是相对于实例方法而言的,因为实例方法可以访问所有全局变量,所有一个通过比较静态方法和实例方法的角度来解答这个问题。
一.语法不同
静态方法(被static修饰):static void a(){方法体};
实例方法(不被static修饰):void b(){方法体};
二.调用方法不同
调用静态方法:1.使用"类名.方法名"的方式,2.使用"对象名.方法名"的方式;
调用实例方法:只能通过"对象名.方法名"的方式;
也就是说,调用静态方法可以无需创建对象。
原因:
静态方法属于类对象,使用公共内存空间,线程执行"类名.方法名"这段代码时,JVM会执行这个类的字节码文件(.class文件),就是把字节码文件加载到内存中然后根据字节码文件(.class文件)创建类对象(Class对象),然后通过类对象(Class对象)调用这个静态方法。
扩展内容:
JVM加载字节码文件和
JVM创建类对象,是俩个步骤。
三.能访问的本类的类成员不同
静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。
原因:
静态方法不可以调非静态全局变量,从内存的角度看,就是当类被加载的时候静态方法和静态属性(全局静态变量)被加载到内存中并被初始化,就是在内存中开辟一段内存地址用来保存静态方法和静态属性,这时候没有被new的实例(对象)在内存中是不存在的,而非静态的全局变量是在new一个实例时才会被在内存中创建,所以静态方法是不能访问非静态的全局变量,除非在类被实例化的时候,就是new 了这个类的对象时候,在内存中给这个类开辟一些内存空间保存这个类的对象并创建并初始化了非静态全局变量,这个时候就可以用静态方法去访问非静态的全部变量。
属于个人理解,如有错误请指正
Java静态方法为什么不能访问非静态全局变量
最新推荐文章于 2024-06-21 13:33:49 发布