gpt4 book ai didi

java - 在java代码示例中,什么是引用,什么是值?

转载 作者:行者123 更新时间:2023-12-01 07:07:30 27 4
gpt4 key购买 nike

让我们一劳永逸地弄清楚术语。我对所有与通过引用和值(value)传递有关的在线冲突词汇感到困惑。

下面是一个将对象参数传递给方法的简单干净的示例。
结果是迈克格兰特的名字和他的年龄一样被屠杀。所以底层对象被改变了。

2 主要问题:

  • 什么是值(value) , 什么是 引用 ?
  • 哈希码 不同于p1曾经changePersonObject()方法是在上面运行吗?

  • 我的代码:
    public class App {      
    public void changePersonObject(Person p){
    p.setAge(100);
    p.setFirstName("Lost");
    p.setLastName("Boy");
    }

    public static void main(String[] args) {
    App a = new App();
    Person p1 = new Person("Mike", "Grant", 24, 180);
    a.changePersonObject(p1);
    System.out.println(p1); // person objects name is changed to "Lost"
    }
    }

    最佳答案

    Java 确实是按值传递的,但实际上持有这个值的那个与你可能想到的有点不同。 java is pass by value?
    单词value ,在基本数据类型中是数据本身,例如

    int numberA=100  ;
    int numberB=numberA;
    numberA 传递的值至 numberB是数据 100 . Reference type 中的事情永远不会改变:
    Person p = new Person("Lost", "Boy", 24);
    Person person=p;
    person=new Person("Rugal", "Bernstein", 23);
    p 传递的值至 person是指向 Person("Lost", "Boy", 24) 的引用地址一,任何细节请执行上面的程序并自己调试以澄清它们。
    在这里你可能会想,在 person=new Person("Rugal", "Bernstein", 23); 之后现在的人的值(value)与原来的不同。是的,当然,现在如果你 println(person)正如你所想的那样,这将变成一个新的人。
    但是 p 呢? ,是否因为 Java 是按值传递而改变了?
    实际上,经过测试,我发现它不是,即使你改变了 person , 它不会打扰 p . java有什么问题,这里有什么问题吗?
    是的,java 证明里面没有指针,所有传入参数的东西都叫做 reference .让我们回到 C/C++ 编程风格:
    int data=100,temp=50;
    int* pdata=&data;
    int& rdata=data;

    pdata=&temp;
    println("%d %d",*pdata,rdata);

    rdata=temp;
    println("%d %d",*pdata,rdata);
    你能从上面找到什么特别的东西吗?
    是的,实际上在 C/C++ 中,有两种所谓的 pass-by-value方法,第一个由 * 声明被称为 pointer , 第二个以 & 开头命名为 reference ,这里请不要考虑这个与java的引用,因为你以后会发现它们是不同的。
    在 C/C++ 中, reference是一种 alias ,换句话说,这两个变量是完全相同的东西,无论你对其中一个变量所做的任何更改都会影响另一个变量。因为它们只是一回事。
    但是 Pointerreference 略有不同.是的,指针也可以指向一个变量,您也可以使用 *pdata=temp 更改该变量的值.但是这里有个问题,当你使用 pdata=&temp要更改指针本身, data根据 pdata 更改?
    答案是不!
    你可以自己测试!因为指针中存储的值是 data的地址变量,当您想要更改 data 的值时它肯定可以通过引用 *来改变它,但是当您尝试更改存储在 pdata 中的地址时它不会打扰 data因为它们是完全不同的两个变量。
    现在你有一种熟悉的感觉,你曾经有过这种感觉吗?
    是的,在java中所谓的 reference是什么 pointer表现得像在 C/C++ 中一样。
    在这里,我们有交易,在 java 中用 pass-by-value 证明了自己。是正确的, no more pointer是谎言。
    现在让我回答问题:
    1.字值是存储在内存中的数据。在java原始类型中,将真实数据作为值,将地址作为引用类型中的值。
    2.我上面已经解释过了,你可以自己测试一下!
    3.我测试了一些代码, hashcode()只要您的对象的值不变,就不会改变。
    例如:
    Person p = new Person("Lost", "Boy", 24);//Hash Code 38443066
    p.setAge(100); //Hash Code 38443066
    p=new Person("Rugal", "Bernstein", 23);//Hash Code 38444526
    因为在默认情况下, hashcode()方法只测量地址本身,因此只要您的地址不变, hashcode()不会改变。
    您也可以自己覆盖此方法以测量其成员字段。
    方法 changePersonObject()只更改了其中的成员字段,因此与外部 hashcode() 没有区别.您可以通过 person=new Person("Rugal", "Bernstein", 23); 来实现它在这种方法中,它的 hashcode()肯定会改变。
    请试一试,你会对 Java 有更多的理解

    关于java - 在java代码示例中,什么是引用,什么是值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20778389/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com