PDF 课件和源代码下载地址:
https://gitee.com/geektime-geekbang/LetsJava
作者回复: 1)对 2)对 你理解的很对,比起我当年理解的快多了,赞👍 其实这俩问题都和对象创建以及引用指向对象有关。 1)里面,四个引用分别是代码创建了两个,用来指向对象(指向公告板上的小本子),创建每个对象时,又分别创建了一个,是对象内部的成员变量。 2)也是一样,情况1只有一个本子(对象),改变price都是在操作同一个本子(对象)的同一张纸(成员变量),情况2是两个本子(对象),每个本子(对象)都有price。
作者回复: 成员变量的引用类型会被初始化为null,局部变量(方法里创建的变量)不会被初始化,没有初始化就使用的话会有编译错误
作者回复: phone xiaomi = new phone(); zhuban zhuban1 = new zhuban(); 然后你应该让xiaomi对象的zhuban这个引用指向你新创建出来的对象, 也就是下面这一句: xiaomi.zhuban = zhuban1 P.S. 类名建议按照习惯, 使用首字母大写.
作者回复: bingo,是的我说错了,应该是6个(不包括String在内)
作者回复: 工作中的方式是对的,这个在后面也会说。 从单纯的存取变量值这个功能的角度来说,声明为public当然最方便。 但是这从可管理可扩展上来说就不方便。方法是代码,代码就可以执行逻辑。比如后面会学到的synchronized,或者在set方法里检查一下value的正确性,在get的时候做个复制等等。getset分开也更好控制,比如只给get不给set方法等。更不用说以后可以用aop做各种钩子骚操作。 所以你举的那个例子,不是很贴切。你可以这么想。你有一台电脑,要借给别人用。那么你是直接给TA一个root账号,让TA爱怎么用怎么用呢?还是给他创建一个普通账号,然后在他需要使用root权限的时候,请求你的允许呢? 直接给root权限,就是完全不可控,别人完全可以把你的电脑给弄的面目全非,对比这里就是给成员变量随便赋值,不受任何限制。当然,这确实“方便”。但是方便都有代价。 还有一种想法就是“反正这个类只有我一个人用”。其实这也是不对的。绝大多数人学编程,最终都是要和别人合作写代码的。养成习惯很重要。 我这里说的也不全面,很多东西是只可意会,不可言传,或者要在某个具体的场景下才能体会到。用get和set访问成员变量,是面向对象编程的一个最佳时间,代码写的越久越会有感受。
作者回复: 这是给对象的属性赋值 比如phone.mainboard.cpu=cpu,就是给phone的mainboard的cpu属性赋值,赋为什么呢?局部变量cpu代表的值。 其余的类似。
作者回复: Sorry,算的。数数数错了……
作者回复: 首先,Java中所有的对象都是在堆(heap)中的,new 操作符就是在堆中分配一块内存,然后存放对象的数据。 FAQ里的《02章-Java 中的内存是怎么分配的 .md》供你参考。 https://github.com/geektime-geekbang/LetsJava/blob/master/FAQ/02%E7%AB%A0-Java%20%E4%B8%AD%E7%9A%84%E5%86%85%E5%AD%98%E6%98%AF%E6%80%8E%E4%B9%88%E5%88%86%E9%85%8D%E7%9A%84%20.md
作者回复: Java中除了string对象,所有对象都是new操作符创建出来的。storage对象里只有引用,创建出来时引用没有指向任何对象。
作者回复: 后面会提到,有强制类型转换