Java 为什么我不能给方法返回的对象引用赋值?
我有一个函数,它返回一个对象的引用。为什么我不能将这个返回的引用指定给另一个对象?函数返回的引用不是final,因此应该允许我更改它的值以指向另一个对象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[
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;