源代码获取地址:https://github.com/BruceEckel/Onjava8-examples
第一章 什么是对象
1.1抽象的历程
万物皆对象,对于想解决的问题中的任何元素,都可以在程序中用对象来呈现(比如:狗、建筑、服务等);
对象具有状态、行为及标识。对象可以拥有内部数据和方法。
1.2对象具有接口
所有的对象,都能被归为一类,同一类对象会拥有一些共同的行为和特征。
类描述了一系列具有相同特征(数据元素)和行为(功能方法)的对象。像浮点型这样的类型也具有一定的元素和方法,因此类就是数据类型。
创建抽象数据类型(class)是面向对象编程的一个基本概念。java自带一些内置类型,其与抽象数据类型工作原理是一样的。可以通过创建对象实例,调用类的方法;
1.3对象可以提供服务
要把对象理解为“服务的提供者”,程序本身也是通过使用其他对象提供的服务为用户提供服务的。
在设计对象时常犯的错误是为对象添加过多的功能。一个复杂的功能,最好拆分为多个对象来实现,一个对象只实现一个通用功能。例如收银系统打印小票这个程序。将生成账单定义为一个对象,链接打印机定义为一个对象,结合调用生成小票数据和调用链接打印机程序定义为一个对象;遵循高内聚、低耦合的设计原则。
1.4隐藏的实现
创建通用工具类时,通过访问修饰符,控制暴露出的接口给其他人员调用,同时隐藏其他不必要的信息,例如数据操作逻辑或其他无需让使用者了解的逻辑细节。这样可以保证接口的稳定性,提高重写效率。
1.5复用的实现
一个类稳定后就可以进行复用。方式一:实例化对象进行使用;方式二:可以将对象放到新的类中;也可任意组合。
1.6继承
用于两个或多个功能相近的类,例如A类和B类功能相似,但B类功能相对A多。此时可以创建好A类后,B类继承A类,在A类的基础上扩展新的功能。A类被称为基类、父类、超类;B类被称为子类、派生类、继承类。
大部分时候,继承需要为子类添加新的方法,方式一:扩展(extends);方式二:重写(overwrite);
1.7多态
由子类到基类,向上转变对象的类型。
场景:定义一个方法DuoTai(BaseClass bc),通过调用基类中的一些通用函数来实现功能,参数是基类对象。此时在另一个场景下,假如同时实例化多个该基类的子类,并将其作为参数去调用DuoTai,那么程序实际是执行不同子类中的方法,这一点在设计程序中适用于业务中有通用方法,但不同子类需求不同,需重写基类方法。
1.9集合
不同的集合提供了不同类型的接口和行为;不同的集合在特定操作的执行效率方面有差异;
泛型:参数化类型机制,避免向下转型;
1.10对象的创建和生命周期
C++的宗旨是效率优先,需提前声明对象的数量、生命周期和类型,通过栈区(“局部变量”)保存对象,或将对象保存在静态存储区内。
Java只允许动态分配内存,通过关键字new创建对象的实例;底层支持垃圾收集器机制,会自动将无用对象销毁;
1.11异常处理
异常处理是将编程语言甚至是操作系统和错处理机制绑定在一起。
第二章 java安装
第三章 对象无处不在
3.1通过引用操作对象
电视(对象),遥控器(引用)。可通过遥控器对操作电视。
3.2必须创建所有对象
引用的作用是关联对象。通过new关键字来创建对象。
3.2.1数据保存在哪里
对于内存管理的5种数据存储方式:
寄存器(register),数据保存在CPU中,程序无法控制寄存器的分配;
栈(stack),数据保存在RAM中,处理器通过栈指针直接操作数据。迅速、高效仅次于寄存器;系统在创建应用程序时就必须明确栈上所有对象的生命周期;
堆(heap),数据保存在RAM中,不关心对象存储生命周期,较为灵活;需要一个对象时,可以通过new来创建,当代码被执行时,java会在堆上为该对象分配内存;分配和清理存储要比栈花费时间多,但随着java技术的进步,开发者无需过多关注此分配和清理存储;
常量存储(constant storage),通常直接保存在代码中;有些嵌入式程序会将常量存储在只读存储器ROM中
非RAM存储,如果一段数据没有保存在应用程序里,那么该数据的生命周期既不依赖于应用程序是否允许,也不受应用程序的管制;
3.2.2特殊情况:基本类型(primitive type)
无需通过new来创建基本类型变量,会自动在栈上保存他的值,运行效率更高;
java为基本类型提供了对应的包装类(wrapper class),通过包装类可将基本类型呈现为位于堆上的非原始对象;
char c = 'X';
Character ch = new Character(c);
自动装箱机制可以将基本类型自动转换为包装类对象;
Character ch = 'X';
3.3注释
支持/* XX 。*/和//两种形式
3.4无需销毁对象
作用域:花括号{}
对象的作用域:Java对象的生命周期和基本类型不一样,当通过new创建对象时,对象在作用域结束仍然存在,只不过由于作用域结束无法再获取。Java通过垃圾收集器去自动回收那些不被引用的对象;
3.5使用class关键字创建新类型
包含方法或字段
当一个类的字段是基本类型时,即使不初始化,他们也会有默认值;需区分,局部变量不会自动赋默认值;
3.7 编写Java程序
使用域名反转的方式,后面加上多个"."描述子目录的结构,避免命名冲突的问题。.net是通过命名空间的方式。 包名从JAVA2开始全部小写。
引入其他组件使用import关键字。
第四章 操作符
优先级:先乘除后加减;也可通过小括号来明确计算顺序;
基本类型的赋值a=b,后面再修改a的值,并不会影响b;引用类型赋值,例如对象间c=d,就是将c和d都指向原本只有d指向的那个对象。将对一个对象作为参数传递给一个方法时,同样时引用类型赋值;
关系操作符:Integer类型比较时,要有equls函数。因为通过==对比比较的是对象的引用。出于效率原因,Integer会通过亨元模式来缓存-128-127之间的对象,因此多次调用Integer.valueOf(127)生成的是一个对象。但假如不在上述范围,那么每次生成都会新建一个对象。