Java核心技术卷1——第四章下
-
面向对象设计概述
-
结构化程序设计
-
OOP
-
web浏览器的例子
-
类
-
对象
-
识别类
-
类之间关系
-
使用现有类
-
对象和对象变量
-
Date类
-
GregorianCalendar类
-
更改器方法和访问器方法
-
用户自定义类
-
一个Employee类
-
-
最简单的类
-
构造器
-
方法
-
域
-
多个源文件的使用
-
源文件
-
.java
-
可以包含多个class
-
只能有一个public class
-
且该class名与源文件名相同
-
习惯性一个class一个源文件
-
编译源代码
-
通配符匹配
-
javac Employee*.java
-
隐式编译调用的class
-
javac EmployeeTest.java
-
会自动重新编译新的.java
-
解析Employee类
-
类方法
-
构造器
-
方法
-
关键字public
-
任何类的任何方法都可以调用这些方法
-
实例域
-
关键字private
-
确保只有Employee类自身的方法能够访问这些实例域
-
封装性好
-
可包含属于某个类的实例域
-
比如String类
-
从构造器开始
-
与类同名
-
构造类对象时被运行
-
初始化实例域(初始状态)
-
伴随new操作符的执行被调用
-
C++:Employee number007("Janes Bond",10000,1950,1,1);//可不用new
-
不能对已存在的对象调用构造器
-
没有返回值
-
不要定义与实例域重名的局部变量
-
隐式参数和显示参数
-
隐式参数
-
方法名前的对象名
-
this
-
可明显区分实例域和局部参数
-
显示参数
-
方法名后的参数
-
封装的优点
-
getxxx访问器方法
-
只返回实例域值
-
域访问器
-
类应提供
-
一个私有的数据域
-
一个公有的域访问器方法
-
一个公有的域更改器方法
-
比简单的公有数据域复杂些
-
好处:
-
可以改变内部实现,仅改变类方法
-
更改器方法可以执行错误检查
-
不要返回引用可变对象的访问器方法
-
会破坏封装性
-
返回的对象引用可改变引用同一对象的私有状态
-
应该返回其克隆
-
return (Object)obj.clone();//Object,obj看具体情况
-
-
基于类的访问权限
-
方法可以访问所调对象的私有数据
-
方法可以访问所属类的所有对象的私有数据
-
私有方法
-
公有数据危险——>私有数据
-
方法
-
绝大多数公有
-
特殊情况私有
-
计算代码划分成多个独立的辅助方法
-
辅助方法不应该成为公有接口的一部分
-
实现机制紧密/需要特别的调用次序
-
私有方法不被外部类操作调用,可删除
-
公有方法不能随意删除
-
Final实例域
-
构建对象时必须初始化
-
构造器执行后,必须已被设置
-
后面操作不能修改值
-
可变类用final定义,其状态还是可以改变
-
仅对象引用为常量
-
静态域与静态方法
-
static修饰
-
静态域
-
每个类只有一份
-
类域
-
静态常量
-
static final
-
公有常量
-
public final
-
不怕被类对象修改
-
静态方法
-
不能向对象实施操作的方法
-
没有隐式参数
-
不能访问实例域
-
只能访问自身类中的静态域
-
使用情况
-
一个方法不需要访问对象状态,其参数都是通过显示参数提供
-
一个方法只需访问类的静态域
-
factory方法
-
NumberFormat类
-
NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();
-
NumberFormat percentFormatter = NumberFormat.getPercentIntence();
-
double x = 0.1;
-
System.out.println(currencyFormatter.format(x));//$0.10
-
System.out.println(percentFormatter.format(x));//10%
-
使用factory方法产生不同风格的格式对象
-
无法命名构造器时使用
-
需要不同名字
-
需要改变构造器返回对象类型
-
main方法
-
方法参数
-
值传递
-
接收的是调用者提供的值
-
引用传递
-
接收的是调用者提供的变量的地址
-
一个方法可以修改传递引用所对应的变量值,不能修改传递值调用所对应的变量值
-
Java程序设计语言总是采用值传递
-
对象引用可调用方法改变值
-
但依旧是值传递,对象引用的拷贝
-
-
对象构造
-
多种编写构造器的方式
-
重载
-
特征:
-
多个构造器
-
多个方法,相同方法名,不同参数类型
-
方法的签名:方法名,参数类型
-
默认域初始化
-
自动赋默认值
-
局部变量必须初始化
-
默认构造器
-
没有参数的构造器
-
没有编写构造器,提供默认构造器
-
默认构造器将实例域设置默认值
-
提供了至少一个构造器,没有默认构造器,视为不合法
-
显示域初始化
-
不同构造器采用多种形式设置类的实例域的初始状态
-
执行构造器前先赋值,希望所有构造器对某一特定实例域赋相同的值
-
初始值不一定是常量
-
参数名
-
前面加a区分
-
同样的名字屏蔽,用this区分
-
调用另一个构造器
-
this(...)
-
放在构造器第一句,将调用同一类的另一个构造器
-
对公共构造器代码部分只编写一次即可
-
初始化块
-
初始化数据域
-
在构造器赋值
-
声明中赋值
-
初始化块
-
-
静态代码块在类加载的时候运行
-
用static块打印”Hello world“,结尾加System.exit(0),可不用main函数
-
int nextInt(int n);//返回0-n-1之间的随机数
-
对象析构和finalize方法
-
析构器(C++)
-
放置一些当对象不再使用时需要执行的清理代码
-
比如回收分配给对象的存储空间
-
Java不支持(有自动的垃圾回收器)
-
finalize方法
-
在垃圾回收器清除对象前调用
-
System.runFinalizersOnExit(true)能确保finalize方法在Java关闭前调用(不安全)
-
使用Runtime.addShutdownHook添加“关闭钩”
-
某个资源需要在使用完毕立刻被关闭——人工管理
-
应用类似dispose或close的方法完成相应的清理操作
-
包
-
组织类
-
一个类可以访问
-
所属包所有类
-
其他包公有类
-
import java.util.*(访问util包所有类)
-
分隔代码库
-
标准java包
-
java
-
javax
-
使用包的主要原因是确保类名的唯一性
-
还需保证包名唯一
-
静态导入
-
import导入包
-
import导入静态方法
-
import导入静态域
-
import static java.lang.System.*;//可使用System类的静态方法和静态域,不用加类前缀,out.print("hello");
-
import static java.lang.System.out;//导入特定方法或域
-
将类放在包中
-
package com.aaa.bbb;//没有写,放默认包(defaulf package)
-
包名
-
会有与包名匹配的子目录
-
包中文件
-
源文件.java
-
类文件.class
-
基目录
-
.java(默认包)
-
.class
-
com/
-
core/
-
.java(包com.core)
-
.class
-
从基目录编译和运行类
-
编译器——.java
-
解释器——.class
-
-
包的作用域
-
修饰符
-
public
-
可被任意类使用
-
private
-
只能被定义他们的类使用
-
默认
-
可被同一包中的所有方法访问
-
禁止加载用户自定义的、包名以java.开始的类
-
可用包密封机制解决自定义类的密封性
-
类路径
-
类路径必须与包名匹配
-
类存储在文件系统的子目录
-
类文件也可以存储到JAR文件(Java归档)中,
-
JAR文件中可包含多个压缩形式的类文件和子目录,既节省又改善性能
-
程序用到第三方的库文件时通常会给出一个或多个需要包含JAR文件
-
JDK也提供许多JAR文件,如jre/lib子目录下有数千个类库文件
-
JAR文件使用ZIP格式组织文件和子目录。可以使用所有ZIP实用程序查看内部rt.jar以及其他的JAR文件
-
使类被多个程序共享,需要:
-
把类放到一个目录
-
/home/user/classdir/包/类
-
将JAR文件放在一个目录
-
/home/user/archives
-
设置类路径class path(所有包含类文件的路径的集合)
-
UNIX中,类路径中的不同项目之间用:分隔
-
Windows中,用;分隔
-
.表示当前路径
-
类路径包括
-
基路径/home/user/classdir或c:\classes;
-
当前目录.
-
JAR文件/home/suer/archives/archive.jar或c:\archives\archive.jar
-
JAVA SE 6
-
可在JAR文件目录中指定通配符
-
/home/user/classdir:.:/home/suer/archives/'*'或者c:\classdir;.;c:\archives\*
-
但在UNIX中禁用*,以防止shell命令进一步扩展
-
设定类路径
-
文档注释
-
javadoc
-
由源文件生成一个HTML文档
-
/**开始的注释*/结束
-
抽取信息
-
包
-
公有类与接口
-
公有的和受保护的方法
-
公有的和受保护的域
-
标记@
-
@自由格式文本
-
第一句:概要性句子
-
概要页
-
可以使用html修饰符
-
不要用<h1><hr>
-
图片放在doc-files中
-
类注释
-
必须在import之后,类定义之前
-
/**
-
*/
-
public class xxx{}
-
方法注释
-
放在所描述的方法之前
-
除通用标记,还可以用
-
@param variable description
-
对当前方法的param部分添加一个条目
-
可占据多行,可以使用HTML标记
-
一个方法的所有@param必须放一起
-
@return description
-
对方法添加return部分
-
可占据多行,可以使用HTML标记
-
@throws class description
-
添加一个注释,用于表示这个方法有可能抛出异常
-
/**
-
*Raises the salary of an employee
-
*@param byPercent the percentage by which to raise the salary(e.g. 10 =10%)
-
*@return the amount of the raise
-
*/
-
public double raiseSalary(double byPercent){
-
double raise = salsry*byPercent/100;
-
salary += raise;
-
return raise;
-
}
-
域注释
-
只需对公有域(静态常量)建立文档
-
/**
-
*The "Hearts" card suit
-
*/
-
public static final int HEARTS = 1;
-
通用注释
-
@author name
-
产生一个作者条目
-
可使用多个@author
-
@version text
-
产生一个“version”条目
-
text是对当前版本的任何描述
-
@deprecated text
-
对类、方法、变量添加一个不再使用的注释
-
@see和@link
-
可以使用超级链接、链接到javadoc文档的相关部分或外部文档
-
@see reference
-
在see also 部分增加一个超级链接
-
可以用于类中
-
可以用于方法
-
链接到方法
-
@see com.core.Employee#raiseSalary(double)
-
@see <a href="www.baidu.com">baidu</a>
-
@see "Core Java 2 volume 2"
-
指向其他类或方法
-
{@link package.class#feature label}
-
包与概述注释
-
可以直接将类、方法和变量的注释放置在Java源文件中
-
包注释要在每个包目录中添加一个单独的文件
-
方法一:以package.html命名的HTML文件,在<body>...</body>之间的所有文件都会被抽取出来
-
方法二:以package-info.java命名的Java文件。以/**和*/界定,跟随在一个包语句之后
-
为所有源文件提供一个概述性的注释。
-
放在名为overview.html的文件中,位于包含所有源文件的父目录中。标记<body>...</body>之间的所有文本将被抽取出来
-
在导航栏选择“Overview”时,就会显示这些注释内容
-
注释的抽取
-
假设HTML文件将放在目录docDirectory下
-
执行以下步骤:
-
切换到包含想要生成文档的源文件目录
-
如果是一个包,运行
-
javadoc -d docDirectory nameOfPackage
-
或对于多个包生成文档,运行:
-
javadoc -d docDirectory nameOfPackage1 nameOfPackage2...
-
如果文件在默认包中,运行
-
javadoc -d docDirectory *.java
-
为标准类添加超链接
-
javadoc -link http://java.sun.com
-
需要进一步定制
-
非html文档
-
自定义doclet
-
搜索一组源程序文件
-
DocCheck
-
类设计技巧
-
一定将数据设计为私有
-
一定对数据初始化
-
不要在类中使用过多的基本数据类型
-
不是所有的域都需要独立的域访问器和域更改器
-
使用标准格式进行类的定义
-
公有访问特性部分
-
包作用域访问特性部分
-
私有访问特性部分
-
每部分应该列出
-
实例方法
-
静态方法
-
实例域
-
静态域
-
将职责过多的类进行分解
-
类名和方法名要能够体现他们的职责

浙公网安备 33010602011771号