Thinking in Java 读书总结(一)

前言

以前有零散地阅读过TIJ,可是都是针对本身的问题去有针对性的阅读,没有从头梳理过Java的一些基础知识。从前段时间开始本身也开始了总体性地学习TIJ的过程,也从这篇博客开始把本身的一些感悟和理解总结起来,也但愿能对你们和我本身都有些帮助。html

第二章 一切都是对象

第一章大体都是一些面向对象语言或针对JAVA的特性的一些介绍,在后面的每一章中都有详细的介绍,因此从读书总结从第二张开始。java

2.1 用引用操做对象

  • 对于Java对象,操做的标识符都是引用,且引用可脱离对象单独存在。
  • 若是向未指向对象的引用发送消息,那么会返回一个运行时错误 -->动态绑定机制。

2.2 对象存储

2.2.1 JVM的存储分区

对于这一块,JVM的内存模型是必需要清楚的内容,这个博客对于JVM内存模型的介绍很是全面,能够参考学习。 简略的说,内存能够分为虚拟机栈,本地方法栈,程序计数器,堆,方法区(包含运行时常量池)等部分。学习

2.2.2 基本类型

Java在任何平台上每种基本类型所占空间的大小都一致,这也是Java跨平台特性的缘由之一。 编码

参考2.2.1中可知,java基本类型不存储在堆中,而基本类型对饮的包装类的实例对象存储在堆中,java提供了自动包装机制来处理基本类型和实例对象的转换问题。spa

特别的是:基本类型的包装类和String类都是final的,不可变,因此每次操做都会生成一个新的对象,看起来和基本类型的传值操做很类似。 且String类在初始化时JVM针对其初始化的方式的不一样会有不一样的处理,后面专门讲解String的章节会详细介绍。code

2.3 对象做用域

java中主要是用花括号来控制做用范围。 基本类型的做用域:htm

{
  int x = 12;
  /* only x available */
  {
    int q = 96;
    /* both x & q available */
  }
  /* only x available */
  /* q “out of scope” */
}

而下面的方式是不容许的,在C++中是能够的,但在Java中是不被容许的。对象

{
  int x = 12;
  {
    int x = 96; /* illegal */
  }
}

对象的做用域: new的对象能够存活在做用域以外,只要有引用一直指向它,那么对象就不会消失,但在范围外引用会失效。blog

2.4 类

2.4.1 成员变量初始化

类的成员变量在实例化时会自动初始化,在没有指定的状况下,基本类型会初始化成为默认值,类对象会设置成为null。继承

  • <table> <tr> <td>类型 </td> <td>值</td> </tr> <tr> <td>Boolean </td> <td>false</td> </tr> <tr> <td>Boolean </td> <td>false</td> </tr> <tr> <td>char </td> <td>false</td> </tr> <tr> <td>Boolean </td> <td>'\u0000'(null)</td> </tr> <tr> <td>byte </td> <td>(byte)0</td> </tr>

<tr> <td>short </td> <td>(short)0</td> </tr> <tr> <td>int</td> <td>0</td> </tr> <tr> <td>long</td> <td>0L</td> </tr> <tr> <td>float</td> <td>0F</td> </tr> <tr> <td>double</td> <td>0D</td> </tr> </table> 可是局部变量不会设置默认初始值!须要本身初始化,若是忘记了,那么在编译时会范围错误。

p.s. 这里初始化的问题在后面类的初始化和加载的时候会详细讨论,涉及继承,多态等状况时,初始化会变得较为复杂。

2.8 注释和嵌入式文档

在注释内按照标准的格式输入,能够利用JavaDoc提取文档。 独立文档标签是一些@开头的命令。

  1. @see引用其余类,能够和@author,@version一块儿使用
  2. @docRoot产生到根目录的相对路径
  3. @link,@inheritDoc,@Param等等

2.9 编码风格

  1. 驼峰风格,Java标准。
  2. java代码通常都是摆放开,闭花括号的方式。

第三章 操做符

3.1

静态导入:其实很好理解,和普通import的区别就在于静态导入后使用对应类的静态方法时不须要使用类名.静态方法的方式,能够直接使用方法名。但其实我我的认为通常用import就能够了,由于静态方法多的时候,使用静态import一旦出现重名的状况很容易发生冲突。

3.7 equals和==

这是java里使人很迷惑的部分,能够参考17章的笔记~

3.8 逻辑操做符

  • 在java中,只有boolean值能够做为判断语句的参数,和C语言不同能够用0和其余值的区别来判断。
  • String + boolean,此时boolean也会被转型成为String。

3.10 按位操做符

  • 与&,或|,非~,异或^
  • Boolean能够与,或,异或,可是不能够按位非(非是0,1间切换)

3.11 移位操做符

  • 左移:左移位运算符(<<)能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补0)。
  • 右移:有符号”右移位运算符(>>)则将运算符左边的运算对象向右移动运算符右侧指定的位数。“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1。Java也添加了一种“无符号”右移位运算符(>>>),它使用了“零扩展”:不管正负,都在高位插入0。这一运算符是C或C++没有的。这一点很重要!

对char, byte, short类型的数值进行移位处理,在移位进行以前,会被转换成int类型,而且最终也会获得int。

类型转换

  • 基本类型的类型转换中,窄化转换必需要强制类型转换,可是扩辗转换不须要显示的类型转换。

  • 布尔类型不支持类型转换!

  • 截尾与舍入

    • 从高的基本类型转为低的时,会采用截尾操做
    • 若是想从float,double到int用舍入操做,那么能够用Math.round()。
    • Java中对int型进行任何操做时,都会容易出现溢出的状况,必需要留意(Java不会提示你超过范围了)。

第四章 控制执行流程

4.7 java goto

goto在C,C++中是不推荐使用的,在java中没有goto关键字,java经过另外一种加了限定的方式实现了受控的goto。

label1:
    //外部循环
{
    //内部循环
    {
        //...
        break; //1
        //...
        continue; //2
        //...
        continue label1; //3
        //...
        break label1; //4
    }
}

上面伪代码中若是执行到3处,那么会跳转到循环外label1处继续进行迭代;

若是进行到4出那么会跳转到label1处,而且不会从新进入迭代。

总结

前三章相对来讲都是很是基础的内容,在以前的工做中基本都已经熟悉了。可是有几点须要注意:

  1. JVM的内存模型和GC的过程,这个须要专门的学习,后面也会从新看一下深刻JVM的书籍,上学的时候看感受不怎么能看得懂,如今值得从新学习一波。在平常工做中使用JAVA感受理解Java底层的工做原理真的会有很大的帮助;
  2. String类型在Java里是一种很是特殊的类型,须要好好专门学习学习。
相关文章
相关标签/搜索