开发了这么几年,每次都是基于业务代码去考虑代码,没有思考底层的实现,突然发现好失败,从此开始记录每一次的学习, 今天有个小伙伴问了我个问题:在java 中,创建一个类,然后去调用这个类中的static方法,为什么不能 new 这个对象调用,而用对象点方法名调用:
经过查找资料:
当你New 一个对象的时候,并不是先在堆中为对象开辟内存空间,而是先将类中的静态方法(带有static修饰的静态函数)的代码加载到一个叫做方法区的地方,然后 再在堆内存中创建对象。所以说静态方法会随着类的加载而被加载。当你new一个对象时,该对象存在于堆内存中,this关键字一般指该对象,但是如果没有 new对象,而是通过类名调用该类的静态方法也可以。
程序最终都是在内存中执行,变量只有在内存中占有一席之地时才会被访问,类的静态成员(静态和方法)属于类本身,在类加载的时候就会分配内存,可以 通过类名直接去访问,非静态成员(变量和方法)属于类的对象,所以只有在类创建的时候才会分配内存,然后通过类的对象去访问。