在Java中为返回变量赋值

在Java中为返回变量赋值,java,reference,Java,Reference,这可能是一个基本问题,但我不确定用什么关键字来搜索它 是否可以在Java中为返回变量赋值,类似于: static int a[] = new int[2]; static int f(int i) { return a[i]; } static void main() { f(1) = 0; // <-- this } static int a[]=new int[2]; 静态整数f(整数i){ 返回一个[i]; } 静态void main(){ f(1)=0;//即

这可能是一个基本问题,但我不确定用什么关键字来搜索它

是否可以在Java中为返回变量赋值,类似于:

static int a[] = new int[2];

static int f(int i) {
    return a[i];
}

static void main() {
    f(1) = 0; // <-- this
}
static int a[]=new int[2];
静态整数f(整数i){
返回一个[i];
}
静态void main(){

f(1)=0;//即使是引用类型,方法调用也不是变量

但是,类似这样的情况也可以:

static MyClass func() {
   return new MyClass();
}

public static void main(String[] args) {
   func().setAttr(null); // change attributes
}
这是不可能的(请参阅其他注释),但您可以创建自己的MutableInteger类,该类允许修改其值:

public class MutableInteger {
    public int value;
    public MutableInteger(int value) {
        this.value = value;
    }
    public MutableInteger() {
        this(0);
    }
}

static MutableInteger a[] = new MutableInteger[2];
static {
    for (int i=0; i<a.length; i++) {
        a[i] = new MutableInteger();
    }
}

static MutableInteger f(int i) {
    return a[i];
}

static void main() {
    f(1).value = 0; // <-- this
}
公共类MutableInteger{
公共价值观;
公共可变整数(int值){
这个值=值;
}
公共可变整数(){
这(0);
}
}
静态可变整数a[]=新的可变整数[2];
静止的{

对于(inti=0;iNo)。在Java中,只有基元类型(它们的行为与C++中的行为基本相同)引用类型的行为类似于C++指针和C++引用的混合——当使用<代码>时,它们会被自动取消。<代码> > />代码>总是改变引用点的值,而不是引用对象的值。

这将不起作用。“机器”级。
在方法
f
中,表达式
a[i]
被求值为
int
值。返回此int值时,与该值关联的数组没有任何连接。从方法返回后,Java虚拟机的操作数堆栈上就有了
int
值(把它看作一个中间值)并且可以用它做点什么。你可以把它去掉(如果你在一行中写
f(1);
),你可以把它赋给一个变量(
int x=f(1)
),就是这样。

一种方法是把你的数组变成一个s数组(或者
AtomicInteger
s),并返回对该数组的第i个元素的引用:

static AtomicInteger a[] = new AtomicInteger[2];
static {
    for (int i = 0; i < a.length; ++i) {
        a[i] = new AtomicInteger(0);
    }
}

static AtomicInteger f(int i) {
    return a[i];
}

public static void main(String[] args) {
    f(1).set(0);
}
静态原子整数a[]=新的原子整数[2];
静止的{
对于(int i=0;i
这将是一个编译错误,因为要求左侧为an、an或an,而
f(1)
为a

撇开编译错误不谈,Java不是这样工作的。在Java中,一切都是按值传递的——特别是在这个特定的示例中,因为返回类型是
int

static /*RETURN TYPE IS PRIMITIVE VALUE:*/ int f(int i) {
    return a[i];
}
如果我们添加一个中间变量,它会变得更清晰:

static /*RETURN TYPE IS PRIMITIVE VALUE:*/ int f(int i) {
    int ret = a[i]; // ret is an independent value from a[i]
                    // it and a[i] can be changed without affecting each other
    return return ret;
}
OP的问题是

在Java中是否可以为返回变量赋值

非常简单…(注意,我指定10来显示证明,因为初始化的int数组中的所有值都是0)

另一个例子…愚蠢,但有效

static int a[] = new int[2];

static int[] f(int[] p) {
    return p;
}

static void main() {
    f(a)[1] = 10;
}
还有一个

static int a[] = new int[2];

static void f(int i, int val) {
    a[i] = val;
    return;
}

static void main() {
    f(1, 10);
}

您可能对lambdas如何应用于这个问题感兴趣,尽管这只适用于Java8预览

假设在标准库中有这样定义的接口:

interface Block<T> {
    void accept(T v);
}

<> p>所以你的函数将返回代码块>代码>,你可以在以后调用它的代码>接受< /COD>给它一个存储的值。< /P>不,不,不。java引用不是C++引用。不要混淆这两个。java引用更类似于C/C++指针。(除非它们被不透明地处理、自动取消引用并始终引用有效对象)。Java引用是按值传递的。请参见@pst-Uh,这正是Dimath在问题中所说的,否?“在C/C++中,我可以返回指针并稍后为其赋值”?@melpomene“返回变量”的事实"在原始问题中使用的意思是有很多不理解的东西。虽然类似的方法可以用指针来在C/C++中完成,但是用C++引用处理这样的事情也是很常见的。我不想进一步猜测作者的意图/ java想法。技术。考虑重构的面向对象风格,就像这个答案中的一个。@ RubyTuesdayDONO(NIT:没有指针)@ PST-触摸,我措辞很差。我的意思是java阻止指针到甚至根本不存在的指针席!<代码> f(…)
的返回类型为
int
,但随后它返回一个
MutableInteger
?@RichardJPLeGuen不是我的日子。最初创建代码时,我将参数设置为MutableInt,并将返回类型设置为int。从一开始就应该是另一种方式。
interface Block<T> {
    void accept(T v);
}
// Declare an array
int[] a = new int[5];

// Capture an "assignment reference" to element 2 
Block<Integer> elem2 = v -> a[2] = v;

// Some time later, we want to store a new value in that element:
elem2.accept(360);