【自学】Java核心技术卷1_4对象与类
- 实例instance:由类构造对象的过程称为创建类的实例
- 实例域instance field:对象中的数据称为实例域
- 方法:操纵数据的“过程”称为方法(这里是面向过程编程的“过程”)
- 状态:对象的实例域的值集合称为对象当前的状态(只能通过调用方法改变状态)
类之间的关系:
- 依赖(A uses-a B):A类的方法要使用B类的对象——尽量减少依赖关系,降低类间耦合
- 聚合(A has-a B):A类的对象包含B类的对象,即B类对象是A类的实例数据
- 继承(A is-a B):父类、子类
- 关联
- 直接关联
- 接口实现
- 先从设计类开始,再往类中添加方法:分析问题中的名词、动词,负责完成动作的对象
- 构造对象、指定其初始状态、应用方法
- 构造器constructor:与类同名的用于构造、初始化对象实例的方法。
- 对象变量:构造好的对象可放在对象变量中,以便多次使用,对象变量的值只是对对象的引用而非对象本身的实例域,没有实际包含对象(此处的引用区别于C++的变量引用别名,而是类似于指针的存在,不过java没有指针)。对象变量没有引用对象时不能调用方法
- Java类库将保存时间与给时间点命名分开,类库包含表示时间点的Date类、日历表示法的LocalDate类,LocalDate类使用静态工厂方法构造对象
- 更改器方法mutator method:能修改对象状态的方法。(默认的)
- 访问器方法accessor method:只访问对象状态的方法。(要带有const)
- Java所有方法都必须在类的内部定义,但方法是否内联由Java虚拟机决定
static
- 静态域:属于类不属于对象,类的所有实例(对象)共享静态实例域(对象的数据)
- 静态常量:static final
- 静态方法:没有隐式参数this,不能操作对象的实例,可以访问类的静态域,类名、对象名均可调用静态方法
工厂方法模式:
- 处理在不指定对象具体类型的情况下创建对象的问题。工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂通常是一个用来创建其他对象的对象。工厂是构造方法的抽象,用来实现不同的分配方案。
//定义几个类
class Button{/* ...*/}
class WinButton extends Button{/* ...*/}
class MacButton extends Button{/* ...*/}
//定义工厂接口ButtonFactory
interface ButtonFactory{
abstract Button createButton();//接口的抽象方法
}
//实现接口的不同的类
class WinButtonFactory implements ButtonFactory{
Button createButton(){
return new WinButton();
}
}
class MacButtonFactory implements ButtonFactory{
Button createButton(){
return new MacButton();
}
}
- 按值调用(call by value) :方法接收的是调用者提供的值。不能修改传值调用所对应的变量值,即不能修改形参对应变量的值。
- 按引用调用(call by reference):方法接收的是调用者提供的变量地址(对某个变量的引用)。方法可以修改传递引用所对应的变量值,即可以修改形参这个引用所指变量的值。 (按引用调用时:形参也是引用,不过是实参的拷贝,所以按引用调用其实也是按(引用)值调用。形参和实参二者引用同一个对象/变量,可以通过形参这个拷贝引用改变其所引对象的状态,但形参无法改变实参这个引用的值,让其引用一个新对象)
- Java 程序设计语言总是采用按值调用,方法得到的是所有参数值的一个拷贝,不能修改传递给它的任何参数变量的内容。
- 方法的签名:方法名和参数类型称为方法的签名。
- 实例域若没在构造器中初始化,则默认初始化为0,false,null等值,而局部变量必须显示初始化
- 仅当类没有提供任何构造器的时候,系统才会提供一个默认的无参构造器
- 初始化实例数据域的方法:在构造器中设置值、在声明中赋值、初始化块
- 初始化块(initializationblock):在一个类的声明中,可以包含多个代码块。只要构造类的对象,这些块就会被执行。
- finalize:Java有自动的垃圾回收器,不需要人工回收内存,所以不支持析构器,但当对象使用了内存之外的其他资源(如文件,如使用了系统资源的另外一个对象的句柄)时,需要用finalize方法在垃圾回收器清除对象之前回收资源。
- close:如果某个资源需要在使用完后立刻被关闭,则应人工调用close方法完成相应清理操作
包
- 一个类可以使用所属包中的所有类,以及其他包中的公有类(public class)。标记为public 的部分可以被任意的类使用;标记为 private 的部分只能被定义它们的类使用。如果没有指定 public或private,这个部分(类、方法或变量)可以被同一个包中的所有方法访问。
- 访问另一个包中的公有类:1)类名前添加完整包名;2)import包或者特定类
- import:可以导入包、类、包中所有类(*)、静态域、静态方法
- 打包:将包名放在源文件开头、包中定义类的代码之前,并把属于包的文件都放在与包名匹配的子目录中
- 类路径:所有包含类文件的路径的集合。类路径列出的目录和归档文件是搜寻类的起始点
-
- 设置类路径:java –classpath …、设置CLASSPATH环境变量(整个指令写在一行)
文档注释
- 在源代码中添加注释(用定界符/**开始),再用JDK的javadoc工具由源文件生成HTML文档
- javadoc命令支持通配符,例如使用*.java来代表当前路径下的所有java源文件,javadoc常用的选项有如下几个:
- -d : 该选项指定一个路径,用于将生成的API文档放到指定的目录下
- -windowtitle : 该选项指定一个字符串,用于设置API文档的浏览器窗口标题
- -doctitle: 该选项指定一个HTML格式的文本,用于指定概述页面的标题(只有对处于多个包下的源文件来生成API文档时,才有概述页面)
- -header: 该选项指定一个HTML格式的文本,包含每个页面的页眉。
- 类注释:放import之后,类定义之前
- 方法注释:方法之前。@param、@return、@throws
- 域注释:只有公有域需要,通常用于静态常量
- 通用注释:@author,@version,@since,@deprecated弃用,@see超链接
OOP技巧(OOP:object oriented programming)
- 保证数据私有
- 对数据初始化:最好显示地初始化所有的数据(类定义或构造器中提供默认值)、
- 不要在类中使用过多的基本类型:用其他的类代替多个相关的基本类型,便于理解
- 不是所有的域都需要访问器和更改器:对象中也有不想被使用的实例域
- 将职责过多的类分解
- 优先使用不可变的类:即不修改对象状态的类(便于多个线程间安全共享对象)
- 类和方法命名要能顾名思义