在Java中将未初始化对象作为参数传递的示例
我刚才看到了一个这样的构造函数:在Java中将未初始化对象作为参数传递的示例,java,object,reference,Java,Object,Reference,我刚才看到了一个这样的构造函数: public class Test { private int x; public int getX(){ return x; } public Test(){ // Default constructor x= 0; } public Test(int x){ // Constructor with parameter this.x=
public class Test {
private int x;
public int getX(){
return x;
}
public Test(){ // Default constructor
x= 0;
}
public Test(int x){ // Constructor with parameter
this.x= x;
}
public Test(Test t){ // Copy-constructor <----This one!!!
if (t!=null){
this.x= t.getX();
}
}
}
然而,我无法编译“局部变量banane可能尚未初始化”
当我更多地思考这个问题时,这对我来说是有意义的。编译器知道该对象尚未初始化,并对此进行了投诉。由于无法将long类型转换为对象,使其看起来像对象的指针/引用,因此我无法想象如何愚弄编译器
或者这只是JVM启动的最新技术。如果是这样的话,是否有Oracle的相关文档?您有两种可能的方法。传递空引用或空文本
public class Fruit {
public static void main(String[] args) {
Test banane = null;
Test jogurt = new Test(banane);
Test basicStuff = new Test(null);
}
}
以下是
t==null
时的情况:
Test jogurt = new Test(null);
您的代码没有编译,因为变量banane
确实没有初始化。以下内容修复了此问题:
Test banane = null;
JAVA可能有两个极端选项
但对于字段变量,编译器不能这样做,所以java会将它们初始化为默认值 首先,我们来清理一些东西。你试图把一些C++概念应用到java中,这并不总是有意义的。
- 在Java中,对象不能“未初始化”2
- 您将null与未初始化的变量混淆
- 而且,Java没有复制构造函数
Java跟踪哪些局部变量被最终初始化(考虑分支)。默认情况下,字段总是初始化的 Java永远不允许将未初始化的变量传递给方法。实际上,如果有一个表达式访问可能未初始化的变量,Java将拒绝编译程序 因为我们已经了解到Java中的对象变量本质上是指针,所以询问
t==null
是有意义的。它不会检查变量是否已初始化
null
是对象变量的完全有效(且“已初始化”)值。因此,如果将计算结果为null的表达式传递给newtest()
,则t
为null。通过使用banane=null
将该值存储在banane
中,或者在调用Test时直接使用文本:newtest(null)
我强烈建议你阅读
1:例如,Test(Test)
constructor中的t
变量2:忽略调用重写方法的基本构造函数当然,在使用之前,您需要初始化
banne
对象:Test banane=null代码>对您是否有意义,java要求在使用前分配变量。让我们不要开始讨论哪些java特性好,哪些不好。我想你误解了我的意思,我将突出我的实际问题。请仔细看看我的问题。我没有问如何修复编译器错误。好的,我又读了一遍你的问题。是的,此行为在JLS(Java语言规范)中定义。局部变量必须初始化,成员自动接受值。坦白地说,我不记得为什么了。好的,谢谢你,这其实是我想知道的。
Test banane = null;