理解Java中的参考概念

St.*_*rio 1 java reference

我的问题是关于引用如何在Java中工作.据我所知,通过阅读 JLS 4.12.2,引用是一个正式名称,允许使用引用指向的对象.请考虑以下代码:

public class A{
    private int a = 0;

    void mutate(){
        a++;
    }
}

public void foo (A a){
    a.mutate();
}

public static void main(String[] args){
    A a = new A(); //a is a reference to the object of type A
    foo(a);
}
Run Code Online (Sandbox Code Playgroud)

函数a本地的引用是否与main函数内使用的引用相同foo?我的意思是==如果我们将操作符作为一个操作数应用于这些引用,则运算符将返回true吗?

The*_*ind 5

主函数的本地引用是否与foo函数中使用的引用相同?

不,引用不同,两个引用指向的实例都是相同的.

pubic void foo (A a){ 
Run Code Online (Sandbox Code Playgroud)

a这里是一个副本的参考amain()(或调用它的任何功能).引用将在此方法的堆栈上,并在方法返回时丢失(Stack unwinds)

public static void main(String[] args){
    A a = new A(); //a is a reference to the object of type A  // A is a reference on the Stack and local to main().
    foo(a);
}
Run Code Online (Sandbox Code Playgroud)


seh*_*seh 5

没有,参考amain()一样的参数a的功能foo().所有函数参数都在Java中通过值传递.在调用时复制引用(main's a)foo()会创建一个指向同一指示对象的新引用(main()由表达式创建的对象new A()).

你会经常听到人们俗称两个引用是"相同的",但真正意味着两个引用指向同一个对象或指示对象.引用本身可能位于不同的寄存器或内存位置,但它们的 - 它们引用的对象 - 可以是相同的,就像其他语言中的指针和引用一样.