1

I am having a simple query.Basically its a theoritical question.I need to clear this idea.I have not found any suitable answer to it.The question is very simple.Suppose we have a class named as A

class A{
    ......
}

Now from my main function i am creating one object of A.

A obj = new A();

now after creating the object i will be able to access any methods,variables present in the class.

But for static methods or variables we can achieve this directly by using class name like

A.methodname();

now my question is if we are creating one object of any class then memory will be allocated for this.Now if we are using static methods are directly calling them via class name then we are not creating any objects,so in that case memory should not be allocated.But without allocating the memory how does we access the methods or any variable name?Using reference also require some memory allocation.so please explain how in this case memory allocation is happening or how we are accessing the methods or variables in the class.

4

6 回答 6

2

现在,如果我们使用静态方法直接通过类名调用它们,那么我们不会创建任何对象,因此在这种情况下不应分配内存。

事实上,你会的。它依赖于 JVM,但 HotSpot JVM 为所有静态字段创建一个特殊对象。您可以在堆转储中看到此对象。

将此作为对象使 GC 更容易跟踪正在使用的对象。卸载 ClassLoader 时会丢弃此类对象。

于 2013-05-13T11:48:19.670 回答
1

这是通过类加载完成的。

我们没有任何对象实例,但我们有一个类代码加载到内存中,因此实际上存在内存分配。

于 2013-05-13T11:46:41.227 回答
1

静态函数只能访问静态变量,并且已经为其分配了内存。

于 2013-05-13T11:46:48.167 回答
1

静态成员(方法和变量)由 JVM 在加载类时分配。

在不分配内存的情况下,我们如何访问方法或任何变量名?

您不能从静态方法访问实例方法或变量。如果你尝试它不会编译。

从静态方法中,您只能访问其他静态方法或静态变量(在类加载时分配)。

于 2013-05-13T11:49:06.040 回答
0

类的所有静态变量都在类加载时加载到内存中,因为每次创建该类的新对象时都会为实例变量分配内存。

但是,静态变量值并不特定于对象的实例,而是由类的所有对象共享,其中实例变量值特定于实例(类对象)。

这就是您可以使用类名访问静态变量的原因,因为它们已经加载到内存中,而实例变量和方法需要创建对象才能访问它们。

干杯!

于 2013-05-13T11:53:33.650 回答
0

对于静态类加载期间的内存分配是在永久代中完成的。它的初始化只发生一次。它与类而不是对象有关。

于 2013-05-13T12:13:03.507 回答