Java 为什么我不能给方法返回的对象引用赋值?

Java 为什么我不能给方法返回的对象引用赋值?,java,oop,reference,variable-assignment,Java,Oop,Reference,Variable Assignment,我有一个函数,它返回一个对象的引用。为什么我不能将这个返回的引用指定给另一个对象?函数返回的引用不是final,因此应该允许我更改它的值以指向另一个对象 class TestClass3 { public TestClass3 hello() { TestClass3 t = new TestClass3(); return t; } } class TestClass1 { public static void main(String[

我有一个函数,它返回一个对象的引用。为什么我不能将这个返回的引用指定给另一个对象?函数返回的引用不是final,因此应该允许我更改它的值以指向另一个对象

class TestClass3 {
    public TestClass3 hello() {
        TestClass3 t = new TestClass3();
        return t;
    }
}

class TestClass1 {
    public static void main(String[] args) {
        TestClass3 obj = new TestClass3();

        // The below line of code gives an error
        obj.hello() = null; 
    }
}

我希望通过调用hello方法返回的引用应该被赋值为null值。

您试图将该方法设置为一个值,如果您仔细想想,这是不可能的,也没有任何意义。如果要保存obj.hello返回的引用,请编写


您需要将obj.hello分配给一个变量,如果需要,可以将该变量设置为null

在您的代码中,当您编写obj.hello时,它只调用方法hello。它不会将hello的返回赋值给任何变量。因此,实际上没有变量保存方法hello的返回值。而您可以将空值分配给同一个变量。这就是它不是有效语法的原因

有效语法应如下所示:

TestClass3 value = obj.hello();
value = null;

简单地说,这是因为Java不允许这样做,而有些语言(例如Python)也允许这样做。在Java中,不能使用现有代码

为什么??Java并不是以函数语言的形式诞生的,所以尽管在Java8中添加了相当多的函数引用,但它们仍然不是一流的公民。因此,您不能像处理类的字段那样,将新值分配给类的方法

但是,由于可以为字段指定值,因此可以执行以下操作:

class TestClass3 {

    public Supplier<TestClass3> hello;

    public TestClass3() {
        this.hello = this::hello;
    }

    public TestClass3 hello() {
        TestClass3 t = new TestClass3();
        return t;
    }
}

class TestClass1 {
    public static void main(String[] args) {
        TestClass3 obj = new TestClass3();
        obj.hello.get(); // calls hello()
        obj.hello = null; // now works
    }
}
hello是对象的行为,不是引用,只有引用可以设置为null

关于空值:

null只是一个引用值。 引用是一个具有名称的变量,可以通过引用对象所在的内存地址来访问对象。 关于对象:

所有对象都有三个基本特征:

状态 行为 身份
您正在尝试将方法设置为值。这是不可能的,也没有意义。你的预期结果对我来说毫无意义。当执行someVar=null时,实际上并没有操作内存中的对象,对象将保持在原来的位置,垃圾收集器将清理它。为什么将引用设置为null毫无意义,Java不提供这种功能。您可以将一个变量设置为null,以不再使用某个引用。@Tom Yes它确实会抛出一个错误,编译器已经发出了错误。测试一下。问题是:您只能为变量赋值。他想给引用计算的值赋值,它不是变量,也不是possible@Patrick我在哪里声明它不会引发编译器错误?我不需要测试它,我知道Java是如何工作的。也谢谢你向我解释我已经向OP解释的内容。
class TestClass3 {

    public Supplier<TestClass3> hello;

    public TestClass3() {
        this.hello = this::hello;
    }

    public TestClass3 hello() {
        TestClass3 t = new TestClass3();
        return t;
    }
}

class TestClass1 {
    public static void main(String[] args) {
        TestClass3 obj = new TestClass3();
        obj.hello.get(); // calls hello()
        obj.hello = null; // now works
    }
}
obj.hello.get();
obj.hello = null;