作者回复: 只说答案没意思,既然同学感兴趣就聊个几块钱的吧。
先给出答案。其实 Java 只存在一种传参的方式,就是用实参给形参赋值。
既然如此,为什么会流传着么一个“java是传值还是传引用”的问题呢?而且很多年前这还是一个非常火的面试题。
究其原因,可能是面试官有C++的背景。因为把这个问题里的java换成C++,就是一道很好的面试题目。
把这个题目当作Java的面试题,首先就是有问题的。Java中的引用类型也是一种值的类型,引用类型的参数传递,即是传值(引用本身就是一种数据类型,数据类型就有值),也是传引用,所以这个问题就模棱两可。这个问题只有在C++这种语言的语境下才有意义。因为那里的对象传值有不一样的含义。
再深入来说,Java分为堆内存和栈内存,分别用来存储对象(new出来的)和局部变量+参数。参数赋值,就是从一个栈内存复制到另一个栈内存,堆内存不会受影响。
所以,即使知道了Java里每个字节是怎么跳动的,依然无法回答着么一个问题。这个问题之于Java就好像问一个司机你炒鸡蛋的时候挂几档起步一样穿越 (-:
作者回复:
能调用什么方法,看引用类型。实际调用的哪个类的方法,看引用指向的对象的类型。
ccp是M类型的引用,通过它只能调用M中定义的方法。
对于能调用的方法,具体执行的是哪个类里定义的方法代码,看覆盖情况