您的位置:首页 > 编程语言 > Java开发

《Thinking in Java 4th》1~13章读书摘要

2007-05-17 19:20 281 查看
    java中,动态绑定是默认行为。

    当组合(composition)动态发生时,通常被称为聚合。

    single-rooted 对象层次使得GC的实现变得简单很多。

    java只使用动态内存分配。

    在语言级别支持并发所带来的特性之一就是程序员无须考虑物理上究竟是一个还是多个CPU。

    脚本语言如(javascript)能解决客户端编程中80%的问题。

第三章 一切都是对象

    C++和Java都是混杂型语言。
   
    尽管在Java中一切都被视为对象,但实际上操作的是对象的引用。对象与引用之间的关系,就像遥控器和电视之间的关系一般。
   
    在java中,所有的对象都在堆中分配空间,而对象的引用则是在栈上分配空间。
   
原始类型

    原始类型的变量在栈上分配空间,直接存放对应的值。
   
    java中原始类型的长度大小是固定的,这与C/C++是不同的;这样的设计结果使得Java语言与其它语言相比更具移植性。
   
    Java中不存在无符号数的概念。
   
高精度数字

    BigInteger和BigDecimal:牺牲速度来换取精度。
   
    Java中的数组必须被初始化,而且不允许出现越界访问。
   
    当创建一个对象数组时,实际是生成了一个对象引用的数组,并且每个引用被自动初始化为由关键字null表示的值。
   
    当创建原始类型的数组时,编译器保证数组对应的内存都被初始化为0。
   
    C/C++中的“当前范围内的名字可以隐藏更大范围内的相同名字"的特性不被Java所支持,因为设计者认为这可能会产生令人疑惑的程序。
   
    对象的引用在其范围结束时被销毁,然而对象本身的销毁是与范围无关的。
   
    对于类中的原始类型成员,编译器保证即使不显式初始化,也会被赋予一个默认值。该保证只对类中的成员有效,对于具备变量无效。
    java要求在使用一个变量前,必须对其初始化,否则会导致编译器报错。
   
    signature of method:method name & argument list
   
    Java中,函数(method)必须在属于某个类的前提下才能创建。
   
    Java中消除了"向前引用"(foward referencing)的问题。
   
    Java中所有的代码都必须在类中编写。
   
    每个Java文件中都自动的引入了一个java类库:java.lang
   
第四章 运算符

    static import
   
    左值必须是独特的、命名变量。
   
    java中的赋值操作,在默认情况下是复制对象的引用,而不是复制对象本身。(注,这里也可以看出C++和Java用引用这个概念的区别之一:C++中引 用被视为可自动解析的常量指针,在初始化后不能改变其指向的位置;而在java中,从前面的赋值操作可以看出,这样的改变是合法的)。
   
    java中单目运算符+的唯一作用是将byte,short或char类型提升为int。
   
    java中运算符==和!=比较的是对象的引用,而不是对象本身。
   
    如果想比较两个对象是否相等,应该调用对象的equal()方法;然而,默认情况下equal()的行为是比较引用,如果想获得期望的行为,必须显式的重载equal()方法。
   
    绝大多数Java类库都实现了自己的equal()方法,因此在比较时比较的是对象,而不是对象引用。
   
    Java中的逻辑运算符的运算对象必须是boolean类型,这个问题上比C++相比,限制更严格。
   
    boolean类型出现在希望String类型的地方时,会自动转化为合适的文本形式。
   
    移位运算符只用于原始、整型类型。
   
    移位运算符>>>在移位处理符号位时进行zero extension。
   
    当对byte,char,short类型变量执行移位操作时,会首先提升为int型,然后指向移位操作,产生的结果为int型。
   
    Java中不提供运算符重载的机制。
   
    Java中允许在原始类型之间进行显式的cast,但是boolean类型不允许任何cast。
    当从浮点类型向整型类型cast时,永远是采取截断的方式进行值转换。
   
    当算术运算的操作数的类型小于int类型时(即char,byte,short),首先会将操作数提升为int类型,然后在执行运算,运算结果为int
   
    C/C++中sizeof()运算符存在的最大意义是程序的可移植性;而java中原始类型的长度与机器无关,因此不需要sizeof()运算符。
   
   
第五章 执行控制

    Java中不支持goto语句。
   
    一定要清楚,在Java中不允许像在C/C++中将数值用作boolean的习惯。
   
    foreach文法
   
    Java中的enum被设计用来和switch完美配合。
   

第六章 初始化和清除

    Java中,对象的创建和初始化是统一的概念,两者不可分割。
   
    this关键字只能在non-static method中使用。
   
从构造函数中调用构造函数

    这需要使用this关键字,此处this关键字的含义发生了变化,当this后跟一个参数列表时,所起的作用是显式的调用与参数相对应的构造函数。
   
    在构造函数中使用this调用另一个构造函数时,存在两个限制:
   
    1。只能使用this调用一个/次构造函数
    2。this调用必须是完成的第一个操作,否则编译器会报错。
   
static的含义:

    当static关键字用于method时,意味着对于这个method不存在this。
    在static method中不能调用non-staticmethod,而反过来则是被允许的。
   
   
GC & finalize()

    GC只了解如何释放通过调用new分配的内存空间,而无法处理其他方式分配的内存。
    当GC准备回收对象占用的空间时,对调用对象的finalize()method,然后等到GC的下一轮再完成对象的释放。
   
    finalize()method存在的意义在于,用户可能不是遵循java默认的内存分配方式,而是采取了某种类似C风格的内存分配方式;这是通过 Java提供的native-method机制——即允许Java程序调用非java代码。目前C/C++是native-method机制支持的仅有的 两种语言。
   
    可以说,finalize()method的存在,主要是完成旧式内存空间的清理空间,而这是绝大多数java程序员不会遇到的。
   
    简单来说,由于GC的存在,Java中不存在析构函数;然而GC的存在并未消除析构函数所执行任务的必要性。
   
    记住,无论是GC还是finalize()函数都不保证一定被执行或调用,所有java需要创建一个完成必要清理工作的method,并显式的调用。
   
    GC对于增加对象创建的速度有重要的影响。
   
    Java中在堆上为对象分配内存的速度,可以作到和其他语言中在栈上分配内存几乎一样快。
   
    Refernece-Counting VS Walk-Through
   
    Adaptive garbage collection schema: stop-and-play & mark-and-sweep
   
类成员初始化

    类成员初始化最直接的方法就是在定义的时候赋初值,注意这在C++中是不允许,C++严格要求所有成员的初始化必须由构造函数中进行。
   
    类原始类型成员的自动初始化发生在构造函数对其初始化之前,后者的存在并不会覆盖前者。该结论对于类中的对象引用同样适用。
   
    类中数据成员的初始化(包括原始类型和对象引用的自动初始化),必须在任何method被调用前完成。
   
    static只能应用于类中的成员(field或method),不能用于修饰局部变量;这点与C++是不同的。
   
    Java中,static成员的初始化只在必要时才发生;即类的第一个对象被创建,或是对static成员的第一次访问。
   
    注意在这个问题上,Java与C++存在着些许差别:C++中静态成员初始化于对象的创建和static成员的访问是无关的,即C++中静态成员的初始化较之Java中,具有更高的优先性。
   
    static成员的初始化发生在non-static成员的初始化之前。
   
    explicit static initialization & static block
   
    instace initialization(for non-static field):该文法对于支持匿名内部类的初始化是很必要的。
   
数组的初始化

    在创建数组时,编译器不允许用户确认数组的大小;在创建数组是,实际上创建的是一个对数组的引用。
   
    在创建一个非原始类型的数组时,实际上创建了一个对象引用的数组,而最终得到的是指向这个数组的引用。
   
变长参数

    Java SE5中增加了对变长参数的支持。
   
枚举类型
    Java SE5中增加了enmu关键字
    枚举类型的一个完美应用是和switch控制语句的配合。
   
   
第七章 访问控制

    Java中的访问控制级别从最宽松到最严格,依次是:public,protected,package access(无对应关键字),private。
   
    一个package中包含一组类,它们组织在同一个名字空间之下。
   
    未命名(缺省)package
   
    compilation unit(translation unit):一个.java文件
    每个.java文件中最多只能有一个public class,且该类的名字必须与文件名相同。
    当编译一个.java文件时,编译器会为其中每个class输出对应的.class文件。

    package声明:必须是一个.java文件的第一条非注释语句,它表达的意思的当前compilation unit属于public声明后库。
   
    Java中不存在C中的条件编译命令。
   
访问限定符

    Java中的访问限定符包括public,protected,private。
    默认访问限制通常被称为package access,有时也被成为friendly,它意味着当前package中的其他类对当前member有访问权限。
   
    当未显式提供限定符时,意味着访问限定为package access。
   
    对于处于同一目录下的.java文件,如果没有显式的package声明,则编译器将所有这样的文件中的类隐式的放入当前文件夹的隐含缺省package
   
    protected 限定符同时包含了package access,即当前package中的其他类可以访问protected成员。
   
    对于类,只有两种访问控制,public或者package access(无public关键字)
   
    通过将构造函数设定为private,可以禁止类对象的直接创建。
   
    Singletion模式:只允许类的一个对象实例被创建。
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息