java - 仅定义对象时会发生什么?
问题描述
我想知道当定义的对象但未初始化时在内存级别会发生什么。
例如:
public class MainClass {
public static void main (String[] args){
Object foo;
}
}
foo是否指向内存空间?这种行为在不同的编程语言之间会发生变化吗?
提前致谢。
编辑:我知道该对象在使用时将指向null,但我很想知道在定义对象之后会发生什么,但尚未实例化。在这种情况下是否有对内存的引用?
解决方案
我想知道当定义的对象但未初始化时在内存级别会发生什么。
让我们假设我们在这里谈论的是 Java。
首先,我必须更正您的错误描述。(出于显而易见的原因......)
这不是定义对象。相反,它是在声明一个变量。标识符foo
表示一个变量。由于变量的类型(在这种情况下)Object
是引用类型,因此变量可能包含对 Java 对象的引用或 null
.
是
foo
指向内存空间吗?
答案有点复杂。
如果变量被初始化,它要么指向某个对象,要么包含
null
.如果变量未初始化,则取决于我们正在谈论的变量类型:
对于类(静态或实例)的字段,未显式初始化的变量默认初始化为
null
.对于作为参数或 catch 变量的变量,Java 语言语义确保该变量始终被初始化......所以这没有实际意义。
对于局部变量,JLS 不会在赋值之前说明它包含的内容。你可以说这个值是不确定的。 但是,JLS(以及在运行时,JVM 的类文件验证器)确保程序不能使用处于不确定状态的局部变量。(读取尚未明确分配的变量是 Java 代码中的编译错误。)因此,变量实际包含的内容确实没有区别。
请注意,在纯 Java 中,变量永远不可能包含不是通过赋值或初始化设置的值。所以变量永远不能引用随机内存地址。(如果您使用本机代码,代码可能会破坏变量以包含任何内容。但不要故意这样做,因为这可能会导致 JVM 硬崩溃。)
这种行为在不同的编程语言之间会发生变化吗?
呃……是的。例如,在 C 和 C++ 中,程序可能会使用尚未初始化的指针变量的值。随之而来的行为是未指定的。
推荐阅读
- python - 命令“/bin/sh -c pip install --upgrade pip && pip install requests”返回非零代码:127
- python - 将嵌套字典中的 csv_rows 与计数相结合
- php - codeigniter 4中的模块和语言
- python - 如何计算我的句子列表中每个句子的正面和负面词的数量?
- regex - 在整个项目的搜索/替换对话框中更改大小写
- sql-server - 查询末尾的“ON”是什么?
- javascript - Discord.js V12 如何锁定某个角色的所有频道?
- ios - FCM 令牌或 APNS 令牌不适用于 iOS 上的 Firebase 通知
- python - 使用 boto3 和 python 将 AWS EC2 详细信息导出到 xlsx/csv
- dart - 发生异常:类型'列表
' 不是类型 'Map 的子类型 '