PDF 课件和源代码下载地址:
https://gitee.com/geektime-geekbang/LetsJava
作者回复: 只说答案没意思,既然同学感兴趣就聊个几块钱的吧。 先给出答案。其实 Java 只存在一种传参的方式,就是用实参给形参赋值。 既然如此,为什么会流传着么一个“java是传值还是传引用”的问题呢?而且很多年前这还是一个非常火的面试题。 究其原因,可能是面试官有C++的背景。因为把这个问题里的java换成C++,就是一道很好的面试题目。 把这个题目当作Java的面试题,首先就是有问题的。Java中的引用类型也是一种值的类型,引用类型的参数传递,即是传值(引用本身就是一种数据类型,数据类型就有值),也是传引用,所以这个问题就模棱两可。这个问题只有在C++这种语言的语境下才有意义。因为那里的对象传值有不一样的含义。 再深入来说,Java分为堆内存和栈内存,分别用来存储对象(new出来的)和局部变量+参数。参数赋值,就是从一个栈内存复制到另一个栈内存,堆内存不会受影响。 所以,即使知道了Java里每个字节是怎么跳动的,依然无法回答着么一个问题。这个问题之于Java就好像问一个司机你炒鸡蛋的时候挂几档起步一样穿越 (-:
作者回复: 手动点赞
作者回复: ✅,总结的超级到位,直达要点
作者回复: 编译不会报错,那是因为m3可能是一个Phone。而编译器并不会去尝试推断m3是不是有可能是别的,强制类型转换=后果自负。但是就这两行代码来说,运行会报错的。
作者回复: 是的,如果没有无参的构造方法,那就必须显式调用父类的构造方法,给这个方法传参。
作者回复: 这样的手机壳真出来了你买么?😄
作者回复: 1:不转没法把它当作目标类型使用呀,除非是用反射 2:✅,虽然不精确,但是道理就是这么个道理
作者回复: 👍
作者回复: 是的,要理解父类的引用可以指向子类的实例,是因为子类集成了父类的方法和属性,所以子类的实例可以当作父类的实例来使用。反之则不行。
作者回复: 你抓住了重点。所以多态嘛,就是有多种行为