2015-06-27 108 views
2

我是Java的初学者,我已经完成了C++。 在C++中,成员函数的存储器分配在它们被声明为一个类的一部分,而不是在创建对象时,将创建对象时,则仅对于实例变量的内存分配完成时完成,那就是每个对象的内存分配对于实例变量都是单独完成的,并且所有对象共同共享成员函数。 在实例变量的情况下,我知道java中发生了同样的情况,但在成员函数的情况下会发生什么?java中对象的内存分配

在C++; 例如如果我们有2个实例变量a和b,并且我们创建了3个对象x,y,z并让我们说我们有一个成员函数getData(),那么所有这3个对象都有一个单独的两个实例变量a和b,但共享getData()的公共副本。

实例变量,同样是在java中的情况,但对于成员函数是什么?

回答

0

在Java中,成员函数被加载点播由classloader。由于整个Java标准库可以与任何Java程序一起使用,并且程序本身可以包含任意数量的类,所以为了将程序启动时间保持在理智的范围内,这是必要的。

因此,无论何时,程序需要一个以任何方式(例如,访问一个静态变量或方法,或创建一个对象实例)的类时,Java classloader都会加载该类,其中包括该班级的成员职能。然后,一旦这个类加载完毕,如果将来需要加载它,则不需要再次加载,因为与您在问题中提到的类似,在任何给定时间只需要一个类字节代码的副本。

为了避免积累越来越多的装入类在程序运行时,Java使用垃圾收集卸载类,它知道它可以安全地卸载,同样它如何使用垃圾收集程序数据。如果这些类再次需要,当然可以在以后重新加载。当然,有些情况下卸载类不会工作,因为重装它会导致静态变量/代码重新初始化/运行。

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

+0

如果一个Java类加载器每次加载类,需要的类,那么为什么静态块在程序初始化一次? –

+1

@RajMalhotra查看我编辑的帖子。 –

2

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

所以它的工作原理一样,你说什么C++:

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