当前位置: 首页 > 知识库问答 >
问题:

在Java中静态初始化和动态初始化有什么区别?[副本]

周云
2023-03-14

最近,当我在LeetCode上做一些练习时,我发现了一些绝妙的解决方案。它使用对象o引用数组Object o=new Object[]{null,null};,我猜可能是因为在Java,所有的东西都是Object。但当我尝试这种方法时,它出错了。Object o3={1,2};所以我尝试了所有的方法来初始化数组,我想看看它们之间的区别,就像下面这样

int arr[] = {1,2};
Object o = arr;
Object o1 = new int[2];
Object o2 = new int[]{1,2};
Object o3 = {1,2};

只有o3会编译一个错误。我不知道是不是因为初始化的方式。我知道当我使用静态初始化时,它会先分配内存,当使用动态初始化时,它不会。它们之间的其他差异会导致这个错误吗?当我使用new创建数组时。它在JVM中做了什么?提前谢谢。

共有1个答案

谭伟
2023-03-14

初始值设定项{1,2}new int[]{1,2}的简写。此速记只能用作int[]类型的变量的初始值设定项。例如,1可以使用以下方法:

int arr[] = {1,2};

这不是:

int arr[];
arr = {1,2}; // ERROR

相反,您需要使用:

int arr[];
arr = new int[] {1,2};

同样,您可以使用:

Object o3 = new int[] {1,2};

附注。以上内容适用于static以及实例字段,也适用于局部变量。Java没有“静态与动态初始化”这样的区分。这是更多的C++术语。

 1嗯,它也可以用于byte[]long[]float[]integer[]等类型的变量,对于这些变量,文字12是赋值兼容的。请参阅《Java语言规范》第10.6节。

 类似资料:
  • 问题内容: 我的问题是关于关键字的一种特殊用法。可以使用关键字覆盖不属于任何函数的类中的代码块。例如,以下代码编译: 如果删除关键字,它将抱怨,因为变量是。但是,可以同时删除和关键字并进行编译。 这两种方式都使我感到困惑。我应该如何拥有不属于任何方法的代码段?如何调用它?通常,此用法的目的是什么?或者更好的是,在哪里可以找到有关此文档的文档? 问题答案: 带有修饰符的代码块表示一个类初始化程序。没

  • 初始化的区别是什么:1)int i=47;或2)int i;{i=47;在哪些情况下我们需要第一个或第二个?

  • 问题内容: 如标题所示,两者之间到底有什么区别 和 除了结构以外,还有什么重要区别吗? 问题答案: 对于您的示例,没有区别。但是如您所见, 只能接受一个表达式来初始化变量。但是,在静态初始化器(JLS 8.7)中,可以执行任意数量的语句。例如,可以这样做: 对于您的示例,显然不需要这样做,但是变量的初始化可能不仅仅使用表达式,甚至可能包含许多语句,因此Java制作了静态初始化器。

  • 问题内容: 我有这个代码: 这会导致编译错误:可能尚未初始化,这很公平。 现在,我将代码更改为: 我得到同样的编译错误!我必须初始化为null: 那么,不初始化对象和初始化为null有什么区别?如果我声明一个没有初始化的对象,它是否为null? 谢谢 问题答案: 字段(成员变量)被初始化为(或初始化为默认的原始值,如果它们是原始的) 局部变量未初始化,您有责任设置初始值。

  • 问题内容: 据我了解,“静态初始化块”用于设置静态字段的值(如果无法在一行中完成的话)。 但是我不明白为什么我们需要为此设置一个特殊的块。例如,我们将字段声明为静态(无值分配)。然后编写几行代码,生成并为上面声明的静态字段分配一个值。 为什么我们需要在这样一个特殊的块这样的行:? 问题答案: 在非静态块: 每次构造类的实例时被调用。在静态块只被调用一次,当类本身初始化,无论该类型的有多少对象创建。

  • 结果将是: 我对这个结果感到困惑,因为根据标准规则,不是静态初始化,是静态初始化,因为这些: 变量或临时对象o的常量初始值设定项是其完全表达式为常量表达式的初始值设定项,但如果o是对象,则这样的初始值设定项也可以为o及其子对象调用constexpr构造函数,即使这些对象是非文字类类型。 如果实体的常量初始值设定项初始化具有静态或线程存储持续时间的变量或临时对象,则执行常量初始化。如果不执行常量初始