读《Java编程思想》的一些心得
《Java编程思想》,也叫《Thinking in Java》。
首先,这是一本非常非常非常好的一本书,是值得二刷、三刷、四刷的书。奈何我读书技巧不够,读的太慢,导致我还未读完这本书。但就目前我读完的地方而言,已经是受益颇多,也刷新了我太多的认知。大学的时候,也有学过Java相关的内容,但是老师讲的并不深刻,亦可能是我理解的不够深刻?总之,有很多东西,知其然不知其所以然,半知半解,也只是到会用的程度。读了这本书以后,让我对很多以前只会用但不深刻理解的地方,有了一个全新的系统的认知,比如,java中一切皆对象,是怎么存储的,亦或者,是如何初始化和清理的,很多很多,全书一共850页左右,我还没有读完,下面针对我读完的地方,聊一聊体会。
1、一切皆对象到底存在了什么地方
首先需要区分开的一个点就是引用和对象的区别,拿我们平时用到的比较多的String类来讲,下面这两个有什么区别?
String s;
String s = “asdf”;
有区别吗?当然有,s是引用,后面的asdf才是对象。可能这么写不明显。
大可以这么写String s = new String("asdf");
显而易见,Java中非常重要的关键字new,即“给我一个新对象”,所以我是不是可以理解为,只要有new的地方就是有新对象出来,就像?媒婆一样?
那new出来的对象和不用new的比如int基本类型,都是存在什么地方呢?
首先,要知道有五个不同的地方可以存储数据:
- 寄存器:最快的存储区,因为它是位于不同于其他存储区的地方-处理器内部。数量有限,按需分配,无法直接控制,也不能在程序中感觉到寄存器的存在。
- 堆栈:位于通用RAM(随机访问存储器)中,通过 堆栈指针可以从处理器那里获得直接支持,所以速度仅次于寄存器。部分数据存储在堆栈中,比如对象引用。
- 堆:一种通用的内存池(也在RAM区),用于存放所有的Java对象(new 操作)。堆不同于堆栈的好处(好处好处),编译器不需要知道存储的数据在队里存活多长时间。
- 常量存储:常量值通常直接存放在程序代码内部。
- 非RAM存储:数据存放在程序之外,在程序没有运行时也可以存在。那可不就是持久化嘛。更高级的就是存数据库了。
java中的8中基本数据类型:boolean,char,byte,short,int,long,float,double。
请记住一句话:所有的基本数值类型,都有正负号。。。。
上面的这8种数据类型,不用new,而是创建了一个并非引用的“自动”变量,而这些所有的基本数据类型,都直接直接直接存放在堆栈中,因此非常高效。
奥对了,知道没啥每个main方法中都有args这个参数吗?
- args用来存储命令行参数
2、操作符
操作符这个玩意,我想对于任何一个刚学编程的人来说,都熟悉的不能再熟悉,所以这里我只说一些我觉得重要的,并且容易犯错的地方。
- 请永远记住,=是赋值或传递引用,==是比较。即a=b,就是把b的对象引用传递给了a,此时,a和b指向一个对象。
- 接上一条,请永远记住,==的确是比较,但是在非基本类型的时候,比较的只是只是只是对象的引用。(基本类型可以直接==或!==)
- 但也大可不必担心,因为大多数Java类库都重写了equals方法,以便对比对象的实际内容。
- 如果一个float与一个double相乘,那么必定会提升类型,结果是double,int和long也是这样。
3、初始化与清理
试想一样,为任何一个类都定义一个Init方法,以确保每个类在使用时得到了初始化。但是如果真的要这么做,我可能会很烦,因为我得时刻记得,我要做这么一步操作。
Java中避免了一个麻烦,java中任何一个类永远默认存在一个与类相同名称的构造器,且在为对象分配存储空间时,自动调用相应的构造器,以达到初始化。
但是,如果自己手动显式的创建了构造器,编译器就不会自动创建默认构造器了。
- 静态数据初始化时,无论创建多少个对象,静态数据都只占用一份存储数据。
- 而初始化的顺序是:先静态变量(如果未在前面的对象创建过程而被初始化),然后才是非静态变量。
4、复用类
java中所有事物,问题解决都是围绕类展开的。
- 继承和组合都能从现有类型生成新类型。并且组合一般是将现有类型作为新类型底层实现的一部分来加以复用,而集成复用的是接口。
- 而继承的时候,子类的构造器中会自动的插入对父类构造器的调用。并且,调用父类构造器是子类构造器要做的第一件事,所以,简单来说,父类的初始化永远比子类早,你可以这么想,有父亲,才会有儿子。
- final关键字,通常代表一个意思。那就是“这是无法改变的”。而final通常可能有三种情况:数据、方法和类
- 对于数据:比如,用final修饰基本数据类型,那么这些数值是恒定不变的。而对于对象,final也一样使引用恒定不变。但也只是引用而已,对象本身是可以改变的。
- 对于方法:就是把方法锁定,以防止任何继承的子类修改它。另外,类中所有的private方法都隐式的指定为final的,由于无法取用private方法,所以也就无法覆盖它,可以对private方法添加final修饰符,但这是多此一举的事情。
- 对于类:防止别人继承。
5、接口
我们通常需要用通用的基类去操作一系列类,java中提供了抽象方法的机制,但是这种方法是不完整的,仅有声明而没有方法体。
所以,包含抽象方法的类叫抽象类,一旦类中存在抽象方法,就必须限定类为抽象的。
所以接口出来了。
- 想要创建一个接口,需要用interface关键字替换class。
- 接口中也可以包含域,但是域会隐式的是static和final的。
- 如果需要让类遵循特定接口,就需要用implements关键字,interface只是外貌,impl实现外貌到底是个啥,怎么工作的。
越往后面,内容越多,且越不容易理解,但也会经常会给人茅塞顿开的感觉。后面还有几块比较重要的我还没有读到,比如,内部类,字符串,类型信息,泛型,容器(List那些),IO,枚举,注解,并发等等。还有很多内容。目前只读了一些非常非常基础的东西,也深刻的理解了他们。来日方长,这是一本非常值得多看几遍的书,完全啃透了,就NB了~加油!