• 业余草
    2019-07-04
    问一下老师:Java 中是“值传递”还是“引用传递”?

    作者回复: 只说答案没意思,既然同学感兴趣就聊个几块钱的吧。

    先给出答案。其实 Java 只存在一种传参的方式,就是用实参给形参赋值。

    既然如此,为什么会流传着么一个“java是传值还是传引用”的问题呢?而且很多年前这还是一个非常火的面试题。

    究其原因,可能是面试官有C++的背景。因为把这个问题里的java换成C++,就是一道很好的面试题目。

    把这个题目当作Java的面试题,首先就是有问题的。Java中的引用类型也是一种值的类型,引用类型的参数传递,即是传值(引用本身就是一种数据类型,数据类型就有值),也是传引用,所以这个问题就模棱两可。这个问题只有在C++这种语言的语境下才有意义。因为那里的对象传值有不一样的含义。

    再深入来说,Java分为堆内存和栈内存,分别用来存储对象(new出来的)和局部变量+参数。参数赋值,就是从一个栈内存复制到另一个栈内存,堆内存不会受影响。

    所以,即使知道了Java里每个字节是怎么跳动的,依然无法回答着么一个问题。这个问题之于Java就好像问一个司机你炒鸡蛋的时候挂几档起步一样穿越 (-:


     1
     9
  • feel魏
    2020-01-26
    看了两遍总算理解了引用关系 emm

    作者回复: 不错不错👍

    
    
  • 小妖精
    2019-10-25
    老师,老师.我new了一个带壳的类,然后MerchandiseV2 ccp = (Phone) ccm; 现在是不是依然是调用带壳类里的所有方法,还是不能调用Phone类里的方法,但是能调用MerchandiseV2里的方法.(都是public而且没有覆盖的情况).如果有覆盖了,就都调用的是ccm带壳类的方法.

    作者回复:
    能调用什么方法,看引用类型。实际调用的哪个类的方法,看引用指向的对象的类型。

    ccp是M类型的引用,通过它只能调用M中定义的方法。

    对于能调用的方法,具体执行的是哪个类里定义的方法代码,看覆盖情况

     1
    
我们在线,来聊聊吧