对象导论
每个对象都有一个接口
类描述了具有相同特性(数据元素)和行为(功能)的对象集合,实际上一种类就是一个数据类型。接口确定了对某一特定对象所能发出的请求,是对象完成各种任务。
被隐藏的具体实现
程序开发人员分为:类创建者、客户端程序员
Java用三个关键字在类的内部设定边界:public(对任何人都可用)、private(除类型创建者和类型的内部方法之外的任何人都不能访问)、protected(与private相似,但继承的类可以访问protected)
类的复用
1.直接使用该类的一个对象
2.将类的一个对象置于某个新的类中,即创建一个成员对象。使用现有的类创建新类,这种概念称为组合(has-a,拥有关系,如汽车拥有引擎),假如是动态发生则称为聚合。
此外:新类的成员对象通常被声明为private,使得使用新类的客户端程序员不能访问他们,类创建者可以在不干扰客户端代码情况下修改这些成员,也可在运行时修改这些成员对象,以实现动态修改程序的行为。(继承并不具有这样的灵活性,因为编译器必须对通过继承而创建的类施加编译时的限制,建立新类时可首先考虑组合)
3.继承:以现有类(当源类:基类、超类、父类)为基础,复制它、添加和修改该副本来创建新类(副本:导出类、继承类、子类)。
新类不仅包括现有类的所有成员,还复制了基类的接口。所有可以发送给父类对象的消息同时也可以发送给子类,通过发送给类的消息的类型可知类的类型,这也就意味着父类和子类具有相同类型
4.实现子类和父类的差异
①直接在子类中添加新方法。
②重写(overriding):子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。
5.“是一个”关系:只重写父类方法;“像是一个”:添加新方法\
向上转型——伴随多态的可互换对象
场景:几何形,不关心是圆形、正方形、三角形还是其他未定义的形状,只要实现绘制、擦除和移动等。即忽略子类的具体细节仅和基类交互,子类的向上转型。
未实现上述场景,OOP语言使用了后期绑定的概念。当向对象发送消息时,被调用的代码直到运行时才确定。编译器确保被调用方法的存在,并对调用参数和返回值执行类型检查,但不知道将被执行的确切代码。Java使用了特殊代码来替代绝对地址调用,实现使用对象存储的信息来计算方法体的地址,这样每个对象都可以具有不同的行为表现。动态绑定是默认行为,不需要添加额外的关键字来实现多态。
单根继承结构
Java的所有类最终都继承自单一的父类,即Object。
所有对象具有一个共用接口,所以它们归根到底都是相同的基本类型。单根继承结构使垃圾回收器易于实现。
容器
1.List(用于存储序列)、Map(关联数组,用来建立对象之间的关联)、Set(每种对象类型仅持有一个)、其他构件如队列、树、堆栈。
2.注:不同容器提供了不同类型的接口和外部行为、对于某些操作具有不同的效率。
向下转型——参数化类型
即泛型。如创建存储Shape的ArrayList:
ArrayList<Shape> shapes = new ArrayList<Shape>();
对象的创建和生命周期
1.c++的对象置于堆栈,对象的存储空间和生命周期在编写程序时确定,欠缺灵活性。
2.Java使用动态内存分配方式,在被称为堆的内存池中动态地创建对象,程序运行时相关代码被执行才能确定。new 关键字来构建对象的动态实例。
异常处理
并发编程
Java与Internet
1.web:客户/服务器计算技术(核心思想是系统具有一个中央信息存储池,通常存于数据库,根据需要将它分发给某些人员或机器集群),web实际上就是一个巨型客户/服务器系统。
2.客户端编程:
①HTML(超文本标记语言,收集数据,提交表单上的数据给服务器)
②CGI(通用网关接口)
③插件(plug-in,下载一段代码并将其插入到浏览器中适当的位置,以此为浏览器添加新功能)
④脚本语言(如JavaScript(不需要任何插件就能得到支持),将客户端程序的源代码嵌入到HTML页面中,解释这种语言的插件在HTML页面被显示时激活。可快速加载但暴露给任何人去浏览、窃取)
⑤Java:通过applet、Java Web Start进行客户端编程
3.服务器端编程:servlet、JSP
一切都是对象
Java引用
1.很多人认为Java引用是指针,但Java并不支持按址传递,对象标识符其实是对象引用,一切事物都是按值传递。
对象的存储
寄存器:最快的存储区,位于处理器内部
堆栈:位于RAM,随机访问存储器,通过堆栈指针分配释放,Java仅有对象引用存储在此
堆: 内存池,也位于RAM存放对象)、常量存储(ROM,只读存储器
非RAM存储:不受程序控制,未运行时也可存在,如流对象(发送给另一个机器)持久化对象(存入磁盘)\
生命周期
1.变量:作用域 2.对象:当不再被引用就会被释放
类
class ATypeName{
字段(数据成员)
方法(成员函数)
}
ATypeName a = new ATypeName();
方法、参数和返回值
1.方法的基本组成部分:方法名、参数、返回值和方法体。
2.方法签名:方法名、参数列表
3.方法只有通过对象才能被调用:对象.方法(参数列表)\
Java程序
import:导包,运用其他构件
static:一是为某特定域分配单一存储空间,不考虑创建多少对象,二是即使没有对象也可以调用方法。static声明成员变量、成员方法,可以对象名.成员变量++(成员方法());、类名.成员变量++(成员方法());。
注释和嵌入式文档
javadoc标签示例