《JAVA编程思想》前三章要点
第一章 对象引论
1,抽象机制
所有编程语言都提供抽象机制,汇编是对底层机器的小型抽象,C是对汇编语言的抽象。
2,每个对象都有一个接口,定义了你能对某一对象发出的请求。在解决问题的建模和设计过程中,把对象看作是“服务提供者”。
3,对象的创建,使用和生命周期
C++注重效率,对象的存储空间和生命周期在编写程序时确定,通过将对象置于堆栈或静态存储区来实现,牺牲了灵活性。
java在堆的内存池中创建对象,采用垃圾回收机制。
4,单根继承结构
除C++外的所有oop语言都是单根继承的,java的这个终极基类就是Object。好处:保证所有对象都有一个公用接口,它们归根到底都属于相同的基本类型。保证所有对象都具有某些功能,即Object类里的那些功能。将所有对象都会用到的必要操作(如垃圾回收)置于Object类中。
5,向下转型与模板泛型
向上转型是安全的,向下转型需要强制转换类型。在C++中提供了模板机制来消除向下转型的需求和犯错,在java中提供了泛型方法来解决这个问题。
6,并发
java是将线程机制内置于其中的,这使得并发变得简单
7,持久性(还没学到)
将对象声明为persistent,在下一次启动程序时候对象能够重生。
第二章 一切都是对象
1,用引用操纵对象
操纵的标识符实际是对象的一个引用,一个很好的比如是把对象和对象的引用看作是电视机和遥控器的关系,你可以拥有一个引用,并不需要一个对象与之关联,你也可以创建一个对象,但并没没有它的引用。
String S;这是一个String对象引用,并没有指向的对象。
2,存储到什么地方
六个不同的地方可以存储数据:
1),寄存器:最快的存储区,你不能直接控制,由编译器根据需求进行分配
2),堆栈:位于RAM中,这是一种仅次于寄存器的快速有效地分配存储方法,编译器必须知道存储在堆栈内所有数据的确切大小和生命周期,以便上下移动堆栈指针。这一约束限制了程序的灵活性。对象的引用存储于堆栈中,但对象并不存储与其中。对象和对象的引用存储分离存储
3),堆:一种通用的内存池,也在RAM内,用于存放所有java对象。堆不同于对战的好处是编译器不需要知道要从堆里分配多少存储区域,也不必知道存储的数据在堆里存活多久,因此堆分配有很大的灵活性,当你需要创建一个对象时,只需要用new写一行代码。当执行这行代码时,会自动在堆里分配,这种灵活性的代价是堆分配比堆栈分配需要更多的时间。
4),静态存储:指存储在固定的位置,也在RAM里。静态存储区存放程序运行时一直存在的数据,用static标识。
5),常量存储:存储在程序代码内部,这样做是安全的,因为它们永远不会被改变。
6),非RAM存储:完全存储于程序之外,不受程序的任何控制,在程序没有运行时也可以存在。如流对象和持久化对象。
特例:基本类型
new将对象存储在堆里,对于一个对象,尤其是小的简单变量就不是很有效。因此java保留基本类型,存储于堆栈中。
高精度数字:BigIteger类和BigDecimal类来进行高进度计算。
3,永远不要销毁对象
对象作用域:当你用new创建一个对象,它可以存活于作用域之外,假设你有下面代码
{
String s = new String("abcdefg");
}
引用s在作用域终点就消失了,然而对象并没有消失,占据着内存空间。永远不要像C++那样消除对象,java提供了自动的垃圾回收机制。
4,基本成员默认值
若类的某个成员是基本数据类型,即使没有初始化,java也确保它获得一个默认值(参见默认值表),千万注意:当基本数据类型作为类的成员时,java才确保其默认值,并不适合于局部变量!!!但最好无论在哪都要自己赋初值。
5,其他
名字可视性:在C中尤为严重,C++引入名字空间的概念,java采用包机制管理名字。
类的定位:import语句。另外,java消除了向前引用的问题。(使用的类的定义在使用的后面)
第三章 控制程序流
1,对象别名问题
操作对象(对象的引用相互赋值)引起的:引用复制后两个引用指向同一个对象,被赋值的那个引用原来指向的对象会被垃圾回收
方法调用中引起的(对象作为方法的参数):对象作为方法的参数,可以改变原来传入的那个对象本身,因为它们传递的是引用。
2,测试对象的等价性
==和!=比较的是对象的引用,如果对象的内容相同,但是引用不同,那么就不相等。
equals()用于比较对象的实际内容是否相同。但是如果你写了一个自己的类,你必须重载equals()方法,因为equals()默认行为是比较引用,大多数类库都实现了用来比较对象的内容的equals()方法,所以类库中的类的对象一般可以直接调用它来比较,而你自己写的类就需要重载equals()来实现这个功能!!!!
3,操作符和表达式
表达式:boolean-exp ? value0:value1 如:i<10 ? i*100 :i*1000
4,类型转换
java允许将任何基本类型数据转化为别的基本数据类型,但布尔类型除外,布尔类型不允许任何类型转换处理。为了将一个类转化为另一个类,必须使用特殊的方法(字符串是特殊情况)。对象只能在类族中转换类型。
5,提升
表达式中出现的最大数据类型决定了结果的数据类型,例如long和double相乘,结果是double型的。对于char,byte,short,混合赋值并不需要类型转换。即使它们执行类型提升也会获得与算数运算相同的结果。
6,java没有sizeof
在C/C++中,sizeof正是为移植所设计的,不同数据类型在不同的机器上可能有不同的大小。而java所有数据类型在所有机器上的大小都是相同的。
7,流程控制
java不允许将一个数组作为布尔值使用,这跟C/C++中的非零即true不一样。
逗号操作符,java里面唯一用到逗号操作符的地方就是for循环里。
break强行退出循环,不执行循环剩余语句,continue停止执行当前迭代,退回循环起始处开始下一次迭代。
while(true)和for(;;)两种无穷循环形式。
标签和continue,break:一般的continue退回最内层循环的开头并继续执行,带标签的continue会达到标签的位置,并重新进入紧接在那个标签后面的循环;一般的break中断并跳出当前循环,带标签的break会中断并跳出标签所指的循环。
重点是java里需要标签的唯一理由就是有循环嵌套,而且你想从不止一个循环中break或continue。
1,抽象机制
所有编程语言都提供抽象机制,汇编是对底层机器的小型抽象,C是对汇编语言的抽象。
2,每个对象都有一个接口,定义了你能对某一对象发出的请求。在解决问题的建模和设计过程中,把对象看作是“服务提供者”。
3,对象的创建,使用和生命周期
C++注重效率,对象的存储空间和生命周期在编写程序时确定,通过将对象置于堆栈或静态存储区来实现,牺牲了灵活性。
java在堆的内存池中创建对象,采用垃圾回收机制。
4,单根继承结构
除C++外的所有oop语言都是单根继承的,java的这个终极基类就是Object。好处:保证所有对象都有一个公用接口,它们归根到底都属于相同的基本类型。保证所有对象都具有某些功能,即Object类里的那些功能。将所有对象都会用到的必要操作(如垃圾回收)置于Object类中。
5,向下转型与模板泛型
向上转型是安全的,向下转型需要强制转换类型。在C++中提供了模板机制来消除向下转型的需求和犯错,在java中提供了泛型方法来解决这个问题。
6,并发
java是将线程机制内置于其中的,这使得并发变得简单
7,持久性(还没学到)
将对象声明为persistent,在下一次启动程序时候对象能够重生。
第二章 一切都是对象
1,用引用操纵对象
操纵的标识符实际是对象的一个引用,一个很好的比如是把对象和对象的引用看作是电视机和遥控器的关系,你可以拥有一个引用,并不需要一个对象与之关联,你也可以创建一个对象,但并没没有它的引用。
String S;这是一个String对象引用,并没有指向的对象。
2,存储到什么地方
六个不同的地方可以存储数据:
1),寄存器:最快的存储区,你不能直接控制,由编译器根据需求进行分配
2),堆栈:位于RAM中,这是一种仅次于寄存器的快速有效地分配存储方法,编译器必须知道存储在堆栈内所有数据的确切大小和生命周期,以便上下移动堆栈指针。这一约束限制了程序的灵活性。对象的引用存储于堆栈中,但对象并不存储与其中。对象和对象的引用存储分离存储
3),堆:一种通用的内存池,也在RAM内,用于存放所有java对象。堆不同于对战的好处是编译器不需要知道要从堆里分配多少存储区域,也不必知道存储的数据在堆里存活多久,因此堆分配有很大的灵活性,当你需要创建一个对象时,只需要用new写一行代码。当执行这行代码时,会自动在堆里分配,这种灵活性的代价是堆分配比堆栈分配需要更多的时间。
4),静态存储:指存储在固定的位置,也在RAM里。静态存储区存放程序运行时一直存在的数据,用static标识。
5),常量存储:存储在程序代码内部,这样做是安全的,因为它们永远不会被改变。
6),非RAM存储:完全存储于程序之外,不受程序的任何控制,在程序没有运行时也可以存在。如流对象和持久化对象。
特例:基本类型
new将对象存储在堆里,对于一个对象,尤其是小的简单变量就不是很有效。因此java保留基本类型,存储于堆栈中。
高精度数字:BigIteger类和BigDecimal类来进行高进度计算。
3,永远不要销毁对象
对象作用域:当你用new创建一个对象,它可以存活于作用域之外,假设你有下面代码
{
String s = new String("abcdefg");
}
引用s在作用域终点就消失了,然而对象并没有消失,占据着内存空间。永远不要像C++那样消除对象,java提供了自动的垃圾回收机制。
4,基本成员默认值
若类的某个成员是基本数据类型,即使没有初始化,java也确保它获得一个默认值(参见默认值表),千万注意:当基本数据类型作为类的成员时,java才确保其默认值,并不适合于局部变量!!!但最好无论在哪都要自己赋初值。
5,其他
名字可视性:在C中尤为严重,C++引入名字空间的概念,java采用包机制管理名字。
类的定位:import语句。另外,java消除了向前引用的问题。(使用的类的定义在使用的后面)
第三章 控制程序流
1,对象别名问题
操作对象(对象的引用相互赋值)引起的:引用复制后两个引用指向同一个对象,被赋值的那个引用原来指向的对象会被垃圾回收
方法调用中引起的(对象作为方法的参数):对象作为方法的参数,可以改变原来传入的那个对象本身,因为它们传递的是引用。
2,测试对象的等价性
==和!=比较的是对象的引用,如果对象的内容相同,但是引用不同,那么就不相等。
equals()用于比较对象的实际内容是否相同。但是如果你写了一个自己的类,你必须重载equals()方法,因为equals()默认行为是比较引用,大多数类库都实现了用来比较对象的内容的equals()方法,所以类库中的类的对象一般可以直接调用它来比较,而你自己写的类就需要重载equals()来实现这个功能!!!!
3,操作符和表达式
表达式:boolean-exp ? value0:value1 如:i<10 ? i*100 :i*1000
4,类型转换
java允许将任何基本类型数据转化为别的基本数据类型,但布尔类型除外,布尔类型不允许任何类型转换处理。为了将一个类转化为另一个类,必须使用特殊的方法(字符串是特殊情况)。对象只能在类族中转换类型。
5,提升
表达式中出现的最大数据类型决定了结果的数据类型,例如long和double相乘,结果是double型的。对于char,byte,short,混合赋值并不需要类型转换。即使它们执行类型提升也会获得与算数运算相同的结果。
6,java没有sizeof
在C/C++中,sizeof正是为移植所设计的,不同数据类型在不同的机器上可能有不同的大小。而java所有数据类型在所有机器上的大小都是相同的。
7,流程控制
java不允许将一个数组作为布尔值使用,这跟C/C++中的非零即true不一样。
逗号操作符,java里面唯一用到逗号操作符的地方就是for循环里。
break强行退出循环,不执行循环剩余语句,continue停止执行当前迭代,退回循环起始处开始下一次迭代。
while(true)和for(;;)两种无穷循环形式。
标签和continue,break:一般的continue退回最内层循环的开头并继续执行,带标签的continue会达到标签的位置,并重新进入紧接在那个标签后面的循环;一般的break中断并跳出当前循环,带标签的break会中断并跳出标签所指的循环。
重点是java里需要标签的唯一理由就是有循环嵌套,而且你想从不止一个循环中break或continue。