java中对象的内存分配 我是java初学者,我已经完成C++。 C++中,成员函数的内存分配是在声明为类的一部分时完成的,而不是在创建对象时创建对象时,只执行实例变量的内存分配,也就是说,对于每个对象,实例变量的内存分配是分开进行的,成员函数由所有对象共享。 对于实例变量,我知道java中也会发生同样的情况,但对于成员函数会发生什么情况? C++中的P> 例如,如果我们有两个实例变量a和b,我们已经创建了3个对象x、y、z,假设我们有一个成员函数getData(), 然后,所有3个对象都有两个实例变量a和b的单独副本,但共享getData()的公共副本

java中对象的内存分配 我是java初学者,我已经完成C++。 C++中,成员函数的内存分配是在声明为类的一部分时完成的,而不是在创建对象时创建对象时,只执行实例变量的内存分配,也就是说,对于每个对象,实例变量的内存分配是分开进行的,成员函数由所有对象共享。 对于实例变量,我知道java中也会发生同样的情况,但对于成员函数会发生什么情况? C++中的P> 例如,如果我们有两个实例变量a和b,我们已经创建了3个对象x、y、z,假设我们有一个成员函数getData(), 然后,所有3个对象都有两个实例变量a和b的单独副本,但共享getData()的公共副本,java,memory,methods,members,Java,Memory,Methods,Members,例如变量,java中的情况也是如此,但成员函数的情况如何?在java中,成员函数是由用户按需加载的。由于整个Java标准库可与任何Java程序一起使用,并且程序本身可能包含任意数量的类,因此这对于将程序启动时间保持在正常范围内是必要的 因此,每当程序以任何方式需要尚未加载的类时(例如,访问静态变量或方法,或创建对象实例),Java类加载器都会加载该类,其中包括该类的成员函数。然后,一旦加载了该类,如果将来需要,就不需要再次加载它,因为与您在问题中提到的类似,在任何给定的时间只需要一个类字节码副本

例如变量,java中的情况也是如此,但成员函数的情况如何?

在java中,成员函数是由用户按需加载的。由于整个Java标准库可与任何Java程序一起使用,并且程序本身可能包含任意数量的类,因此这对于将程序启动时间保持在正常范围内是必要的

因此,每当程序以任何方式需要尚未加载的类时(例如,访问静态变量或方法,或创建对象实例),Java类加载器都会加载该类,其中包括该类的成员函数。然后,一旦加载了该类,如果将来需要,就不需要再次加载它,因为与您在问题中提到的类似,在任何给定的时间只需要一个类字节码副本

为了避免在程序运行时积累越来越多的已加载类,Java使用垃圾收集卸载它知道可以安全卸载的类,类似于它对程序数据使用垃圾收集的方式。当然,如果需要,这些类可以稍后重新加载。当然,在某些情况下,卸载类将无法工作,因为重新加载它可能会导致静态变量/代码重新初始化/运行


这种卸载和重新加载类的功能也可以用于调试:IntelliJ IDEA有一个功能,允许您在程序运行时编辑和重新编译类,卸载该类,然后重新加载新的字节码,以便快速测试IDEA。(哇,我刚刚意识到这听起来完全像是广告。如果你想知道的话,我不是JetBrains的成员。)

在Java中,方法的字节码对于一个类只存在一次;没有为每个对象创建方法字节码的副本。这是不必要和浪费的;当程序运行时,字节码不会改变

因此,它的工作原理与您对C++所说的相同:

。。。成员函数由所有对象共享


如果java类加载器每次都加载该类,那么该类是必需的,那么为什么静态块在程序中初始化一次呢?