Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中将未初始化对象作为参数传递的示例_Java_Object_Reference - Fatal编程技术网

在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可能有两个极端选项

  • 无需初始化字段或局部变量,将提供垃圾值。 如果是这种情况,许多开发人员将调试他们的应用程序以找出问题,因为他们忘记了给变量赋值
  • 2.变量和字段将自动初始化为默认值。 这是一项成本,即使该值将在下一行中被覆盖,也应清理内存位置

    所以JAVA提出了最好的选择,编译器可以分析局部变量,因为它是从“{”开始并以“}”结束的生命周期。如果变量尚未初始化,编译器可以在编译时向我们投诉


    但对于字段变量,编译器不能这样做,所以java会将它们初始化为默认值

    首先,我们来清理一些东西。你试图把一些C++概念应用到java中,这并不总是有意义的。
    • 在Java中,对象不能“未初始化”2
    • 您将null与未初始化的变量混淆
    • 爪哇和C++中变量的工作方式不同
    • 而且,Java没有复制构造函数
    如果在Java中声明一个对象类型为1的变量,该变量将存储我们称之为Java中的“引用”。这与C++引用无关,尽管它看起来可能类似。

    变量可以绑定到对象(即它存储引用),也可以不绑定,在这种情况下,它存储的值是“null”,这是一种特殊的引用。如果你想用C++来类比,最合适的比较就是<代码>测试(test *t)< />代码。所以Java中的对象变量总是存储指针,而不是对象。在Java中,无法将对象存储在变量中。另一方面,在C++中,将对象存储在变量中是默认的。 这是最重要的部分。在C++中,<代码>测试BANAN;<代码>这将创建一个对象并调用默认构造函数。Java没有做到这一点。相反,在C++语言中,它声明了<>代码>测试> BANEA/COD>变量,这些变量是不允许访问的。这就是你困惑的根源


    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;