首页 > 解决方案 > 仅定义对象时会发生什么?

问题描述

我想知道当定义的对象但未初始化时在内存级别会发生什么。

例如:

public class MainClass {
 public static void main (String[] args){
  Object foo;
 }
}

foo是否指向内存空间?这种行为在不同的编程语言之间会发生变化吗?

提前致谢。

编辑:我知道该对象在使用时将指向null,但我很想知道在定义对象之后会发生什么,但尚未实例化。在这种情况下是否有对内存的引用?

标签: javaclassobjectmemory

解决方案


我想知道当定义的对象但未初始化时在内存级别会发生什么。

让我们假设我们在这里谈论的是 Java。

首先,我必须更正您的错误描述。(出于显而易见的原因......)

这不是定义对象。相反,它是在声明一个变量。标识符foo表示一个变量。由于变量的类型(在这种情况下)Object是引用类型,因此变量可能包含对 Java 对象的引用 null.

foo指向内存空间吗?

答案有点复杂。

  • 如果变量被初始化,它要么指向某个对象,要么包含null.

  • 如果变量未初始化,则取决于我们正在谈论的变量类型:

    • 对于类(静态或实例)的字段,未显式初始化的变量默认初始化null.

    • 对于作为参数或 catch 变量的变量,Java 语言语义确保该变量始终被初始化......所以这没有实际意义。

    • 对于局部变量,JLS 不会在赋值之前说明它包含的内容。你可以说这个值是不确定的。 但是,JLS(以及在运行时,JVM 的类文件验证器)确保程序不能使用处于不确定状态的局部变量。(读取尚未明确分配的变量是 Java 代码中的编译错误。)因此,变量实际包含的内容确实没有区别。

请注意,在纯 Java 中,变量永远不可能包含不是通过赋值或初始化设置的值。所以变量永远不能引用随机内存地址。(如果您使用本机代码,代码可能会破坏变量以包含任何内容。但不要故意这样做,因为这可能会导致 JVM 硬崩溃。)

这种行为在不同的编程语言之间会发生变化吗?

呃……是的。例如,在 C 和 C++ 中,程序可能会使用尚未初始化的指针变量的值。随之而来的行为是未指定的。


推荐阅读