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程序设计语言老是采用值传递
      • 对象引用可调用方法改变值
      • 但依旧是值传递,对象引用的拷贝
  • 对象构造
    • 多种编写构造器的方式
    • 重载
      • 特征:
        1. 多个构造器
        2. 多个方法,相同方法名,不一样参数类型
          1. 方法的签名:方法名,参数类型
    • 默认域初始化
      • 自动赋默认值
      • 局部变量必须初始化
    • 默认构造器
      • 没有参数的构造器
      • 没有编写构造器,提供默认构造器
      • 默认构造器将实例域设置默认值
      • 提供了至少一个构造器,没有默认构造器,视为不合法
    • 显示域初始化
      • 不一样构造器采用多种形式设置类的实例域的初始状态
      • 执行构造器前先赋值,但愿全部构造器对某一特定实例域赋相同的值
      • 初始值不必定是常量
    • 参数名
      • 前面加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
          • 为标准类添加超连接
          • 须要进一步定制
            • 非html文档
              • 自定义doclet
            • 搜索一组源程序文件
              • DocCheck
  • 类设计技巧
    • 必定将数据设计为私有
    • 必定对数据初始化
    • 不要在类中使用过多的基本数据类型
    • 不是全部的域都须要独立的域访问器和域更改器
    • 使用标准格式进行类的定义
      • 公有访问特性部分
      • 包做用域访问特性部分
      • 私有访问特性部分
      • 每部分应该列出
        • 实例方法
        • 静态方法
        • 实例域
        • 静态域
    • 将职责过多的类进行分解
    • 类名和方法名要可以体现他们的职责
相关文章
相关标签/搜索