关于 Java 函数参数引用类型的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
请不要在回答技术问题时复制粘贴 AI 生成的内容
857681664

关于 Java 函数参数引用类型的问题

  •  
  •   857681664
    zshnb Oct 30, 2022 2018 views
    This topic created in 1278 days ago, the information mentioned may be changed or developed.

    印象中记得 java 的参数传递方式是引用传递,但是为什么对于基本类型在函数里的参数修改不会影响到函数外传入的变量呢,是因为对于基本类型来说,值就存储在变量本身了吗,还是说基本类型的值是存在栈上,只不过随着函数调用,参数压栈后,对应的值也会跟着参数复制一份,对参数本身的修改就不会影响到函数外传入的值,而对象参数是指向堆的一个地址,即使复制了,也是同一个地址,因此在函数内修改参数对象的值会影响函数外传入的对象值。

    如果想要让 java 也能做到类似 C 语言的解引用,类似 int* aAddr = &b,是不是只要让栈地址暴露出去就可以了。

    public class Reference { public static void main(String[] args) { Reference reference = new Reference(); Student student = new Student(1); System.out.printf("before change student's age: %d\n", student.age); reference.changeReference(student); System.out.printf("after change student's age: %d\n", student.age); int a = 1; System.out.printf("before change int: %d\n", a); reference.changePrimitive(a); System.out.printf("after change int: %d\n", a); } void changeReference(Student s) { s.age += 1; } void changePrimitive(int a) { a = 2; } static class Student { int age; public Student(int age) { this.age = age; } } } 
    5 replies    2022-10-31 09:36:42 +08:00
    Jooooooooo
        1
    Jooooooooo  
       Oct 30, 2022
    java 是值传递, 对象传的是指针.

    基本类型在 java 里确实特殊, 和对象不是一回事
    857681664
        2
    857681664  
    OP
       Oct 30, 2022
    正文里说错了,应该是值传递,刚才又想到,对于基本类型和对象的 print 也会显示不一样的行为,基本类型打印值,对象打印的是堆地址,是不是 java 的基本类型没有地址这一说法,还是 jvm 把基本类型的地址隐藏起来了。
    cpstar
        3
    cpstar  
       Oct 30, 2022
    可以理解基本类型在 java 中是异类,所有就解释通了。为什么要用异类的 int 而不用对象 Integer ,想通了?

    至于输出和使用等等,如果你了解 JVM 的原理,那就根本不会存在到底是引用还是值这个概念,存入的都是值,只不过指令类型不一样。比如 int 的 add 会翻译成 iadd ,然后后边的两个操作数直接相加,而 Integer 的 add 则会一系列 aload 和 invokevirtual 。
    换句话,如果在 bytecode 层面,把 iadd 换成了 invokevirtual ,那就会可能产生你说的 int* aAddr = &b 效果,比如我曾经在 bytecode 层面做出 boolean t; if (t>=0)这样的操作。
    snailsir
        4
    snailsir  
       Oct 31, 2022
    snailsir
        5
    snailsir  
       Oct 31, 2022
    或者看微信公众号发的也行: https://mp.weixin.qq.com/s/h8JW3H1KMS9DXFgGYiwJJg
    About     Help     Advertise     Blog     API     FAQ     Solana     2424 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 15:51 PVG 23:51 LAX 08:51 JFK 11:51
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86