java对象实例化时,类中的方法状态是什么样子的?为什么实例化之后实例可以调用该类中的方法?

2024-12-05 03:31:09
推荐回答(5个)
回答1:

当创建一个类的实例的时候,会在内存中分配空间,空间的大小是通过计算这个类的成员的字节来得到的,这个空间内部还会有一些额外的用于管理的空间,比如存放这个类的方法的地址表的空间。每个实例指向的方法表的空间地址是一样的,这就是为什么通过a.say可以调用方法成员。a.say在内部会被表示为底层语言的表示形式,比如如果是c++,则为a->say();如果是汇编,则是出入栈加上地址跳转,如jmp之类的。

回答2:

a.say();
和C++的
a->say这样的指针用法,是一样的,
A a = new A();
是在给A类创建一个实例。并申请一片内存空间。而你要使用这个实例,就要通过a来使用。
这些都是运行时的。
A a = null;
a.say();
这在编译时是不会出错的。

回答3:

内存分析:
在内存中,局部变量a(在stack内存中)的值为一串地址?这个地址指向了person类的一个实例,这个实例在heap内存中,它里面又分好多块存着它的成员变量。
而方法是存在于code segment内存中的,你调用这个方法,其实主要是调用这个方法的方法体,主要还是在stack和heap中运行,方法只是个包装。
ps:纯属个人理解,不对之处请高手纠正,谢谢~

回答4:

这个确实比较底层,不过实例化一个类是有一定的顺序的。
大概的顺序如下
父类:static{}(无名称方法体)
子类:static{}(无名称方法体)
父类:{}(无名方法体)
父类 构造函数
子类 {}(无名方法体)
子类 构造函数

它会按照一定的顺序,把一个类创建出来,你再调用它的方法就会有了,然后你
如果A类中还有个方法 public A newA(){
return new A();
}
返回的 A的实例,这样为什么可以?
因为你返回的是一个新的类,就像你做了一个机器来生产机器也是可以的。

回答5:

JVM会维护一份记录,哪些类被载入并实例化,记录的目录叫栈区,当你new以后,A就被编入目录(目录存放的是内存地址),而你实例化的对象就是内容在堆区,a.sa()表示,从栈区中目录中找到类A的实例化对象a对象的地址,根据地址找到a,并调用a中的say方法。