JAVA SE学习笔记(内容非常全面,适合程序员)_第1页
JAVA SE学习笔记(内容非常全面,适合程序员)_第2页
JAVA SE学习笔记(内容非常全面,适合程序员)_第3页
JAVA SE学习笔记(内容非常全面,适合程序员)_第4页
JAVA SE学习笔记(内容非常全面,适合程序员)_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java 学习笔记 1 15 JASE SE 知识复习知识复习 1 类是一种抽象的概念 对象是类的一种具体表示形式 是具体的概念 先 有类 然后由类来生成对象 Object 对象又 叫做实例 Instance 2 类由两大部分构成 属性以及方法 属性一般用名词来表示 方法一般用 动词来表示 3 如果一个 java 源文件中定义了多个类 那么这些类中最多只 能有一个类是 public 的 换句话说 定义的多个类可以都不是 public 的 4 在 Java 中进行方法的参数传递时 无论传递的是原生数据类型还是引用类型 参数传递方式统一是传值 pass by value Java 中没有传引用 pass by reference 的概念 5 方法重载 Overload 表示两个或多个方法名字相同 但方法参数不同 方法参数不同有两层含义 1 参数个数不同 2 参数类型不同 注意 方法的返回值对重载没有任何影响 6 构造方法重载 只需看参数即可 如果想在一个构造方法中调用另外一个 构造方法 那么可以使用 this 的方式调用 this 括号中的参数表示目标构造方 法的参数 this 必须要作为构造方法的第一条语句 换句话说 this 之前不能 有任何可执行的代码 7 继承 Inheritence Java 是单继承的 意味着一个类只能从另一个类继承 被继承的类叫做父类 基类 base class 继承的类叫做子类 Java 中的继 承使用 extends 关键字 8 当生成子类对象时 Java 默认首先调用父类的不带参数的构造方法 然后 执行该构造方法 生成父类的对象 接下来 再去调用子类的构造方法 生成 子类的对象 要想生成子类的对象 首先需要生成父类的对象 没有父类对象 就没有子类对象 比如说 没有父亲 就没有孩子 9 super 关键字 super 表示对父类对象的引用 10 如果子类使用 super 显式调用父类的某个构造方法 那么在执行的时候就会 寻找与 super 所对应的构造方法而不会再去寻找父类的不带参数的构造方法 与 this 一样 super 也必须要作为构造方法的第一条执行语句 前面不能有其 他可执行语句 11 关于继承的 3 点 a 父类有的 子类也有 b 父类没有的 子类可以增加 c 父类有的 子类可以改变 12 关于继承的注意事项 a 构造方法不能被继承 b 方法和属性可以被继承 c 子类的构造方法隐式地调用父类的不带参数的构造方法 d 当父类没有不带参数的构造方法时 子类需要使用 super 来显式地调用父 类的构造方法 super 指的是对父类的引用 e super 关键字必须是构造方法中的第一行语句 13 方法重写 Override 又叫做覆写 子类与父类的方法返回类型一样 方 Java 学习笔记 2 15 法名称一样 参数一样 这样我们说子类与父类的方法构成了重写关系 14 方法重写与方法重载之间的关系 重载发生在同一个类内部的两个或多个方 法 重写发生在父类与子类之间 15 当两个方法形成重写关系时 可以在子类方法中通 super run 形式调用父类 的 run 方法 其中 super run 不必放在第一行语句 因此此时父类对象已经构 造完毕 先调用父类的 run 方法还是先调用子类的 run 方法是根据程序的逻辑 决定的 16 在定义一个类的时候 如果没有显式指定该类的父类 那么该类就会继承于 java lang Object 类 JDK 提供的一个类 Object 类是 Java 中所有类的直接或 间接父类 17 多态 Polymorphism 我们说子类就是父类 玫瑰是花 男人是人 因 此多态的意思就是 父类型的引用可以指向子类的对象 1 多态 父类型的引用可以指向子类型的对象 2 Parent p new Child 当使用多态方式调用方法时 首先检查父类 中是否有 sing 方法 如果没有则编译错误 如果有 再去调用子类的 sing 方 法 3 一共有两种类型的强制类型转换 a 向上类型转换 upcast 比如说将 Cat 类型转换为 Animal 类型 即将子 类型转换为父类型 对于向上类型转换 不需要显式指定 b 向下类型转换 downcast 比如将 Animal 类型转换为 Cat 类型 即将父 类型转换为子类型 对于向下类型转换 必须要显式指定 必须要使用强制类 型转换 4 抽象类 abstract class 使用了 abstract 关键字所修饰的类叫做抽象类 抽象类无法实例化 也就是说 不能 new 出来一个抽象类的对象 实例 5 抽象方法 abstract method 使用 abstract 关键字所修饰的方法叫做抽象 方法 抽象方法需要定义在抽象类中 相对于抽象方法 之前所定义的方法叫 做具体方法 有声明 有实现 6 如果一个类包含了抽象方法 那么这个类一定是抽象类 7 如果某个类是抽象类 那么该类可以包含具体方法 有声明 有实现 8 如果一个类中包含了抽象方法 那么这个类一定要声明成 abstract class 也 就是说 该类一定是抽象类 反之 如果某个类是抽象类 那么该类 既可以包含抽象方法 也可以包含具体方法 9 无论何种情况 只要一个类是抽象类 那么这个类就无法实例化 10 在子类继承父类 父类是个抽象类 的情况下 那么该子类必须要实现父 类中所定义的所有抽象方法 否则 该子类需要声明成一个 abstract class 11 接口 interface 接口的地位等同于 class 接口中的所有方法都是抽象 方法 在声明接口中的方法时 可以使用 abstract 关键字 也可以不使用 通 常情况下 都会省略掉 abstract 关键字 12 可以将接口看作是特殊的抽象类 抽象类中可以有具体方法 也可以有抽 象方法 而接口中只能有抽象方法 不能有具体方法 13 类可以实现接口 实现使用关键字 implements 表示 代表了某个类实现 了某个接口 Java 学习笔记 3 15 14 一个类实现了某个接口 那么该类必须要实现接口中声明的所有方法 如 果该类是个抽象类 那么就无需实现接口中的方法了 15 Java 是单继承的 也就是说某个类只能有唯一一个父类 一个类可以实现 多个接口 多个接口之间使用逗号分隔 16 多态 所谓多态 就是父类型的引用可以指向子类型的对象 或者接口类 型的引用可以指向实现该接口的类的实例 关于接口与实现接口的类之间的强 制类型转换方式与父类和子类之间的强制类型转换方式完全一样 17 static 关键字 可以用于修饰属性 也可以用于修饰方法 还可以用于修饰 类 后面的课程讲 18 static 修饰属性 无论一个类生成了多少个对象 所有这些对象共同使用唯 一一份静态的成员变量 一个对象对该静态成员变量进行了修改 其他对象的 该静态成员变量的值也会随之发生变化 如果一个成员变量是 static 的 那么 我们可以通过类名 成员变量名的方式来使用它 推荐使用这种方式 19 static 修饰方法 static 修饰的方法叫做静态方法 对于静态方法来说 可以使用类名 方法名的方式来访问 20 静态方法只能继承 不能重写 Override 21 final 关键字 final 可以修饰属性 方法 类 22 final 修饰类 当一个类被 final 所修饰时 表示该类是一个终态类 即不能 被继承 23 final 修饰方法 当一个方法被 final 所修饰时 表示该方法是一个终态方 法 即不能被重写 Override 24 final 修饰属性 当一个属性被 final 所修饰时 表示该属性不能被改写 25 当 final 修饰一个原生数据类型时 表示该原生数据类型的值不能发生变 化 比如说不能从 10 变为 20 如果 final 修饰一个引用类型时 表示该引用 类型不能再指向其他对象了 但该引用所指向的对象的内容是可以发生变化的 26 对于 final 类型成员变量 一般来说有两种赋初值方式 a 在声明 final 类型的成员变量时就赋上初值 b 在声明 final 类型的成员变量时不赋初值 但在类的所有构造方法中都为其 赋上初值 27 static 代码块 静态代码块 静态代码块的作用也是完成一些初始化工作 首先执行静态代码块 然后执行构造方法 静态代码块在类被加载的时候执行 而构造方法是在生成对象的时候执行 要想调用某个类来生成对象 首先需要 将类加载到 Java 虚拟机上 JVM 然后由 JVM 加载这个类来生成对象 28 类的静态代码块只会执行一次 是在类被加载的时候执行的 因为每个类 只会被加载一次 所以静态代码块也只会被执行一次 而构造方法则不然 每 次生成一个对象的时候都会调用类的构造方法 所以 new 一次就会调用构造方 法一次 29 如果继承体系中既有构造方法 又有静态代码块 那么首先执行最顶层的 类的静态代码块 一直执行到最底层类的静态代码块 然后再去执行最顶层类 的构造方法 一直执行到最底层类的构造方法 注意 静态代码块只会执行 一 次 30 不能在静态方法中访问非静态成员变量 可以在静态方法中访问静态的成 员 变量 可以在非静态方法中访问静态的成员变量 Java 学习笔记 4 15 31 总结 静态的只能访问静态的 非静态的可以访问一切 32 不能在静态方法中使用 this 关键字 1 接口中所声明的方法都是抽象方法 接口中的方法都是 public 的 2 接口中也可以定义成员变量 接口中的成员变量都是 public final static 的 3 一个类不能既是 final 又是 abstract 的 因为 abstract 的主要目的是定义 一种约定 让子类去实现这种约定 而 final 表示该类不能被继承 这样 abstract 希望该类可以被继承而 final 明确说明该类不能被继承 两者矛盾 因此一个类不能既是 final 的 又是 abstract 的 4 Design Pattern 设计模式 单例模式 Singleton 表示一个类只会生成 唯一的一个对象 5 包 package 用于将完成不同功能的类分门别类 放在不同的目录 包 下 包的命名规则 将公司域名反转作为包名 com shengsiyuan 包名 对于包名 每个字母都需要 小写 如果定义类的时候没有使用 package 那么 Java 就认为我们所定义的类 位于默认包里面 default package 6 编译带有 package 声明的 Java 源文件有两种方式 a 直接编译 然后根据类中所定义的包名 逐一手工建立目录结构 最后将生 成的 class 文件放到该目录结构中 很少使用 比较麻烦 b 使用编译参数 d 方式为 javac d 源文件 java 这样在编译后 编译器会 自动帮助我们建立好包所对应的目录结构 7 有两个包名 分别是 aa bb cc 与 aa bb cc dd 那么我们称后者为前者的子包 8 导入 import 将使用 package 分离的各个类导入回来 让编译器能够找到 所需要的类 9 import 的语法 import com shengsiyuan PackageTest 10 import com shengsiyuan 表示导入 com shengsiyuan 包下面的所有类 11 import aa bb 并不会导入 aa bb cc 包下面的类 这时需要这样写 import aa bb import aa bb cc 12 关于 package import class 的顺序问题 a 首先需要定义包 package 可选 b 接下来使用 import 进行导入 可选 c 然后才是 class 或 interface 的定义 13 如果两个类在同一个包下面 那么则不需要导入 直接使用即可 14 访问修饰符 access modifier 1 public 公共的 被 public 所修饰的属性和方法可以被所有类访问 2 protected 受保护的 被 protected 所修饰的属性和方法可以在类内 部 相同包以及该类的子类所访问 3 private 私有的 被 private 所修饰的属性和方法只能在该类内部使用 4 默认的 不加任何访问修饰符 在类内部以及相同包下面的类所使用 Java 学习笔记 5 15 15 instanceof 判断某个对象是否是某个类的实例 语法形式 引用名 instanceof 类名 接口名 返回一个 boolean 值 16 People people new Man 17 System out println people instanceof People 结果为 true 因为 Man 是 People 的子类 根据继承 子类就是父类 因此 Man 也可以看作是 People 的 实例 18 相等性的比较 1 对于原生数据类型来说 比较的是左右两边的值是否相等 2 对于引用类型来说 比较左右两边的引用是否指向同一个对象 或者说左 右两边的引用地址是否相同 19 java lang Object 类 java lang 包在使用的时候无需显式导入 编译时由编 译器自动帮助我们导入 20 API Application Programming Interface 应用编程接口 21 当打印引用时 实际上会打印出引用所指对象的 toString 方法的返回值 因为每个类都直接或间接地继承自 Object 而 Object 类中定义了 toString 因 此每个类都有 toString 这个方法 22 关于进制的表示 16 进制 逢 16 进一 16 进制的数字包括 0 9 A B C D E F 23 equals 方法 该方法定义在 Object 类当中 因此 Java 中的每个类都具 有该方法 对于 Object 类的 equals 方法来说 它是判断调用 equals 方法的引 用与传进来的引用是否一致 即这两个引用是否指向的是同一个对象 对于 Object 类的 equals 方法来说 它等价于 24 对于 String 类的 equals 方法来说 它是判断当前字符串与传进来的字符串 的内容是否一致 25 对于 String 对象的相等性判断来说 请使用 equals 方法 而不要使用 26 String 是常量 其对象一旦创建完毕就无法改变 当使用 拼接字符串时 会生成新的 String 对象 而不是向原有的 String 对象追加内容 27 String Pool 字符串池 28 String s aaa 采用字面值方式赋值 1 查找 String Pool 中是否存在 aaa 这个对象 如果不存在 则在 String Pool 中创建一个 aaa 对象 然后将 String Pool 中的这个 aaa 对象的地址返回来 赋给引用变量 s 这样 s 会指向 String Pool 中的 这个 aaa 字符串对象 2 如果存在 则不创建任何对象 直接将 String Pool 中的这个 aaa 对象地 址返回来 赋给 s 引用 29 String s new String aaa 1 首先在 String Pool 中查找有没有 aaa 这个字符串对象 如果有 则不在 String Pool 中再去创建 aaa 这个对象了 直接在堆中 heap 中创建一个 aaa 字符串对象 然后将堆中的这个 aaa 对象的地址返回来 赋给 s 引 用 导致 s 指向了堆中创建的这个 aaa 字符串对象 Java 学习笔记 6 15 2 如果没有 则首先在 String Pool 中创建一个 aaa 对象 然后再在堆中 heap 创建一个 aaa 对象 然后将堆中的这个 aaa 对象的地址返 回来 赋给 s 引用 导致 s 指向了堆中所创建 的这个 aaa 对象 1 包装类 Wrapper Class 针对于原生数据类型的包装 所有的包装类 8 个 位于 java lang 包下 Java 中的 8 个包装类分别是 Byte Short Integer Long Float Double Character Boolean 他们的使用方式都是一样的 可以实现 原生数据类型与包装类型的双向转换 2 数组 Array 相同类型数据的集合就叫做数组 3 如何定义数组 type 变量名 new type 数组中元素的个数 可以按照下列方 式定义长度为 10 的数组 int a new int 10 或者 int a new int 10 4 数组中的元素索引是从 0 开始的 对于数组来说 最大的索引 数组的长度 1 5 定义数组的第 3 种方式 type 变量名 new type 逗号分隔的初始化值列 表 6 Java 中的每个数组都有一个名为 length 的属性 表示数组的长度 length 属性是 public final int 的 数组长度一旦确定 就不能改变大小 7 int a new int 10 其中 a 是一个引用 它指向了生成的数组对象的首地 址 数组中每个元素都是 int 类型 其中仅存放数据值本身 8 二维数组 二维数组是一种平面的二维结构 本质上是数组的数组 二维数 组的定义方式 type a new type 2 3 9 三维数组 type a new type 2 3 4 10 冒泡排序 掌握交换排序 快速排序的原理与实现方式 11 二分查找 Binary Search 待查找的数组要有序 12 随机生成 50 个数字 整数 每个数字的范围是 10 50 统计每个数字出 现的次数以及出现次数最多的数字与它的个数 最后将每个数字及其出现次数 打印出来 如果某个数字出现次数为 0 则不要打印它 打印时按照数字的升 序排列 1 对于 Java 中的常量的命名规则 所有单词的字母都是大写 如果有多个单 词 那么使用下划线连接即可 比如说 public static final int AGE 0F PERSON 20 2 在 Java 中声明 final 常量时通常都会加上 static 关键字 这样对象的每个 实例都会访问唯一一份常量值 3 IDE Integrated Development Environment 集成开发环境 1 NetBeans http netbeans org 最高版本是 6 9 1 2 JBuilder 3 Intellij IDEA 4 Eclipse 日蚀 月蚀 最高版本 3 6 1 Java 学习笔记 7 15 4 集合中存放的依然是对象的引用而不是对象本身 5 ArrayList 底层采用数组实现 当使用不带参数的构造方法生成 ArrayList 对 象时 实际上会在底层生成一个长度为 10 的 Object 类型数组 6 如果增加的元素个数超过了 10 个 那么 ArrayList 底层会新生成一个数组 长度为原数组的 1 5 倍 1 然后将原数组的内容复制到新数组当中 并且后续 增加的内容都会放到新数组当中 当新数组无法容纳增加的元素时 重复该过 程 7 对于 ArrayList 元素的删除操作 需要将被删除元素的后续元素向前移动 代 价比较高 8 集合当中只能放置对象的引用 无法放置原生数据类型 我们需要使用原生 数据类型的包装类才能加入到集合当中 9 集合当中放置的都是 Object 类型 因此取出来的也是 Object 类型 那么必须要使用强制类型转换将其转换为真正 的类型 放置进去的类型 10 关于 ArrayList 与 LinkedList 的比较分析 a ArrayList 底层采用数组实现 LinkedList 底层采用双向链表实现 b 当执行插入或者删除操作时 采用 LinkedList 比较好 c 当执行搜索操作时 采用 ArrayList 比较好 1 当向 ArrayList 添加一个对象时 实际上就是将该对象放置到了 ArrayList 底层 所维护的数组当中 当向 LinkedList 中添加一个对象时 实际上 LinkedList 内部 会生成一个 Entry 对象 该 Entry 对象的结构为 Entry Entry previous Object element Entry next 其中的 Object 类型的元素 element 就是我们向 LinkedList 中所添加的元素 然后 Entry 又构造好了向前与向后的引用 previous next 最后将生成的这个 Entry 对象加入到了链表当中 换句话说 LinkedList 中所维护的是一个个的 Entry 对象 2 关于 Object 类的 equals 方法的特点 a 自反性 x equals x 应该返回 true b 对称性 x equals y 为 true 那么 y equals x 也为 true c 传递性 x equals y 为 true 并且 y equals z 为 true 那么 x equals z 也应该为 true d 一致性 x equals y 的第一次调用为 true 那么 x equals y 的第二次 第三次 第 n 次调用也应该为 true 前提条件是在比较之间没有修改 x 也没有修改 y e 对于非空引用 x x equals null 返回 false 3 关于 Object 类的 hashCode 方法的特点 a 在 Java 应用的一次执行过程当中 对于同一个对象的 hashCode 方法的多 次调用 他们应该返回同样的值 前提是该对象的信息没有发生变化 b 对于两个对象来说 如果使用 equals 方法比较返回 true 那么这两个对象 的 hashCode 值一定是相同的 c 对于两个对象来说 如果使用 equals 方法比较返回 false 那么这两个对象 Java 学习笔记 8 15 的 hashCode 值不要求一定不同 可以相同 可以不同 但是如果不同则可以 提高应用的性能 d 对于 Object 类来说 不同的 Object 对象的 hashCode 值是不同的 Object 类的 hashCode 值表示的是对象的地址 4 当使用 HashSet 时 hashCode 方法就会得到调用 判断已经存储在集合中 的对象的 hash code 值是否与增加的对象的 hashcode 值一致 如果不一致 直 接加进去 如果一致 再进行 equals 方法的比较 equals 方法如果返回 true 表示对象已经加进去了 就不会再增加新的对象 否则加进去 5 如果我们重写 equals 方法 那么也要重写 hashCode 方法 反之亦然 6 Map 映射 Map 的 keySet 方法会返回 key 的集合 因为 Map 的键是 不能重复的 因此 keySet 方法的返回类型是 Set 而 Map 的值是可以重复的 因此 values 方法的返回类型是 Collection 可以容纳重复的元素 注 HashMap 是异步处理机制 而 Hashtable 是同步的 1 有这样一个类 public class Person Private int id Private String name Private int age getter and setter 要求 假如有若干个类 Person 对象存在一个 List 当中 对他们进行排序 分别按照名字 年龄 id 进行排序 要有正序与倒序两种排序方式 假 如年龄或者姓名重复 按照 id 的正序进行排序 要求使用策略模式进行 2 HashSet 底层是使用 HashMap 实现的 当使用 add 方法将对象添加到 Set 当中时 实际上是将该对象作为底层所维护的 Map 对象的 key 而 value 则都是同一个 Object 对象 该对象我们用不上 3 HashMap 底层维护一个数组 我们向 HashMap 中所放置的对象实际上 是存储在该数组当中 4 当向 HashMap 中 put 一对键值时 它会根据 key 的 hashCode 值计 算出一个位置 该位置就是此对象准备往数组中存放的位置 5 如果该位置没有对象存在 就将此对象直接放进数组当中 如果该位置 已经有对象存在了 则顺着此存在的对象的链开始寻找 Entry 类有一个 Entry 类型的 next 成员变量 指向了该对象的下一个对象 如果此链上 有对象的话 再去使用 equals 方法进行比较 如果对此链上的某个对象的 equals 方法比较为 false 则将该对象放到数组当中 然后将数组中该位 置以前存在的那个对象链接到此对象的后面 6 HashMap 的内存实现布局 7 所谓泛型 就是变量类型的参数化 Java 学习笔记 9 15 1 当遍历集合或数组时 如果需要访问集合或数组的下标 那么最好使用 旧式的方式来实现循环或遍历 而不要使用增强的 for 循环 因为它丢失 了下标信息 2 Integer 类有一个缓存 它会缓存介于 128 127 之间的整数 3 可变参数 可变参数本质上就是一个数组 对于某个声明了可变参数的 方法来说 我们既可以传递离散的值 也可以传递数组对象 但如果将方法 中的参数定义为数组 那么只能传递数组对象而不能传递离散的值 4 可变参数必须要作为方法参数的最后一个参数 即一个方法不可能具有 两个或两个以上的可变参数 5 枚举 Enum 我们所定义的每个枚举类型都继承自 java lang Enum 类 枚举中的每个成员默认都是 public static final 的 6 而每个枚举的成员其实就是您定义的枚举类型的一個实例 Instance 换句话说 当定义了一个枚举类型后 在编译时刻就能确定该枚举类型有几 个实例 分别是什么 在运行期间我们无法再使用该枚举类型创建新的实例 了 这些实例在编译期间就已经完全确定下来了 7 静态导入 a import static mon Common Age b import static mon Common output 8 表示导入 Common 类中的静态成员变量 AGE 以及静态方法 output 注意 使用 import static 时 要一直导入到类中的静态成员变量或静态方法 9 Java 中 无论生成某个类的多少个对象 这些对象都会对应于同一个 Class 对象 1 要想使用反射 首先需要获得待处理类或对象所对应的 Class 对象 2 获取某个类或某个对象所对应的 Class 对象的常用的 3 种方式 a 使用 Class 类的静态方法 forName Class forName java lang String b 使用类的 class 语法 String class c 使用对象的 getClass 方法 String s aa Class clazz s getClass 3 若想通过类的不带参数的构造方法来生成对象 我们有两种方式 a 先获得 Class 对象 然后通过该 Class 对象的 newInstance 方法 直接生成即可 Class classType String class Object obj classType newInstance b 先获得 Class 对象 然后通过该对象获得对应的 Constructor 对象 再通过该 Constructor 对象的 newInstance 方法生成 Class classType Customer class Constructor cons classType getConstructor new Class Object obj cons newInstance new Object 4 若想通过类的带参数的构造方法生成对象 只能使用下面这一种方式 Class classType Customer class Constructor cons classType getConstructor new Java 学习笔记 10 15 Class String class int class Object obj cons newInstance new Object hello 3 5 Integer TYPE 返回的是 int 而 Integer class 返回的是 Integer 类 所对应的 Class 对象 1 静态代理模式图示 2 Java 注解 Annotation a Override 注解表示子类要重写 override 父类的对应方法 b Deprecated 注解表示方法是不建议被使用的 c SuppressWarnings 注解表示抑制警告 3 自定义注解 当注解中的属性名为 value 时 在对其赋值时可以不指定 属性的名称而直接写上属性值即可 除了 value 以外的其他值都需要使用 name value 这种赋值方式 即明确指定给谁赋值 4 当我们使用 interface 关键字定义一个注解时 该注解隐含地继承了 java lang annotation Annotation 接口 如果我们定义了一个接口 并且 让该接口继承自 Annotation 那么我们所定义的接口依然还是接口而不是 注解 Annotation 本身是接口而不是注解 可以与 Enum 类比 5 JUnit 3 8 4 x Keep the bar green to keep the code clean 6 我的名言 没有反射 很多框架就不存在了 No Reflection No most frameworks 7 JUnit4 的执行的一般流程 a 首先获得待测试类所对应的 Class 对象 b 然后通过该 Class 对象获得当前类中所有 public 方法所对应的 Method 数组 c 遍历该 Method 数组 取得每一个 Method 对象 d 调用每个 Method 对象的 isAnnotationPresent Test class 方法 判断该方法是否被 Test 注解所修饰 e 如果该方法返回 true 那么调用 method invoke 方法去执行该方法 否则不执行 8 单元测试不是为了证明你是对的 而是证明你没有错误 9 Writing Secure Code 编写安全的代码 Input is evil 10 异常 Exception 11 Java 中的异常分为两大类 a Checked exception 非 Runtime Exception b Unchecked exception Runtime Exception 12 Java 中所有的异常类都会直接或间接地继承自 Exception 13 RuntimeException 类也是直接继承自 Exception 类 它叫做运行时异 常 Java 中所有的运行时异常都会直接或间接地继承自 RuntimeException 14 Java 中凡是继承自 Exception 而不是继承自 RuntimeException 的类都 是非运行时异常 15 异常处理的一般结构是 try Java 学习笔记 11 15 catch Exception e finally 无论程序是否出现异常 finally 块中的代码都是会被执行的 16 对于非运行时异常 checked exception 必须要对其进行处理 处 理方式有两种 第一种是使用 try catch finally 进行捕获 第二种是在调用该会 产生异常的方法所在的方法声明 throws Exception 17 对于运行时异常 runtime exception 我们可以不对其进行处理 也可以对其进行处理 推荐不对其进行处理 18 NullPointerException 是空指针异常 出现该异常的原因在于某个引 用为 null 但你却调用了它的某个方法 这时就会出现该异常 1 所谓自定义异常 通常就是定义了一个继承自 Exception 类的子类 那 么这个类就是一个自定义异常类 通常情况下 我们都会直接继承自 Exception 类 一般不会继承某个运行时的异常类 2 我们可以使用多个 catch 块来捕获异常 这时需要将父类型的 catch 块 放到子类型的 catch 块之后 这样才能保证后续的 catch 可能被执行 否则子类型的 catch 将永远无法到达 Java 编译器会报编译错误 如果 多个 catch 块的异常类型是独立的 MyException MyException2 那 么谁前谁后都是可以的 3 如果 try 块中存在 return 语句 那么首先也需要将 finally 块中的 代码执行完毕 然后方法再返回 4 如果 try 块中存在 System exit 0 语句 那么就不会执行 finally 块中的代码 因为 System exit 0 会终止当前运行的 Java 虚拟机 程 序会在虚拟机终止前结束执行 5 GUI Graphical User Interface 图形用户界面 6 AWT Abstract Window Toolkit 抽象窗口工具集 第一代的 Java GUI 组件 是重量级的 7 Swing 不依赖于底层细节 轻量级的组件 1 内部类 Inner Class 内部类共分为 4 种 2 静态内部类 static inner class 只能访问外部类的静态成员变量与静 态方法 生成静态内部类对象的方式为 OuterClass InnerClass inner new OuterClass InnerClass 3 成员内部类 member inner class 可以访问外部类的静态与非静态的方 法与成员变量 生成成员内部类对象的方式为 Java 学习笔记 12 15 OuterClass InnerClass inner new OuterClass new InnerClass 4 若想在局部内部类中访问外部类的成员变量 语法为 OuterClass this a 5 局部内部类 Local Inner Class 定义在方法当中 只能访问方法中声 明的 final 类型的变量 6 匿名内部类 Anonymous Inner Class 匿名内部类会隐式地继承一个父 类或实现一个接口 7 所谓递归 Recursion 就是方法调用自身 对于递归来说 一定有一个出 口 让递归结束 只有这样才能保证不出现死循环 8 作业 给定任意一个目录 以树形方式展现出该目录中的所有子目录和文件 另外 在展现的时候将目录排在上面 文件排在下面 每一层要加上缩进 1 一个类若想被序列化 则需要实现 java io Serializable 接口 该接口 中没有定义任何方法 是一个标识性接口 Marker Interface 当一个类实现 了该接口 就表示这个类的对象是可以序列化的 2 在序列化时 static 变量是无法序列化的 如果 A 包含了对 B 的引用 那 么在序列化 A 的时候也会将 B 一并地序列化 如果此时 A 可以序列化 B 无 法序列化 那么当序列化 A 的时候就会发生异常 这时就需要将对 B 的引用 设为 transient 该关键字表示变量不会被序列化 3 当我们在一个待序列化 反序列化的类中实现了以上两个 private 方法 方 法声明要与上面的保持完全的一致 那么就允许我们以更加底层 更加细粒度 的方式控制序列化 反序列化的过程 4 Java 中如果我们自己没有产生线程 那么系统就会给我们产生一个线程 主线程 main 方法就在主线程上运行 我们的程序都是由线程来执行的 5 进程 执行中的程序 程序是静态的概念 进程是动态的概念 6 线程的实现有两种方式 第一种方式是继承 Thread 类 然后重写 run 方法 第二种是实现 Runnable 接口 然后实现其 run 方法 7 将我们希望线程执行的代码放到 run 方法中 然后通过 start 方法来启动 线程 start 方法首先为线程的执行准备好系统资源 然后再去调用 run 方法 当某个类继承了 Thread 类之后 该类就叫做一个线程类 8 一个进程至少要包含一个线程 9 对于单核 CPU 来说 某一时刻只能有一个线程在执行 微观串行 从宏观 角度来看 多个线程在同时执行 宏观并行 10 对于双核或双核以上的 CPU 来说 可以真正做到微观并行 11 1 Thread 类也实现了 Runnable 接口 因此实现了 Runnable 接口中的 run 方法 2 当生成一个线程对象时 如果没有为其设定名字 那么线程对象的名字将 使用如下 形式 Thread number 该 number 将是自动增加的 并被所有的 Thread 对 象所共享 因为它是 static 的成员变量 3 当使用第一种方式来生成线程对象时 我们需要重写 run 方法 因为 Thread 类的 run 方法此时什么事情也不做 4 当使用第二种方式来生成线程对象时 我们需要实现 Runnable 接口的 run 方法 然后使用 new Thread new MyThread 假如 MyThread 已经实 Java 学习笔记 13 15 现了 Runnable 接口 来生成线程对象 这时的线程对象的 run 方法就会调用 MyThread 类的 run 方法 这样我们自己编写的 run 方法就执行了 12 关于成员变量与局部变量 如果一个变量是成员变量 那么多个线程对同 一个对象的成员变量进行操作时 他们对该成员变量是彼此影响的 也就是说 一个线程对成员变量的改变会影响到另一个线程 13 如果一个变量是局部变量 那么每个线程都会有一个该局部变量的拷贝 一个线程对该局部变量的改变不会影响到其他的线程 14 停止线程的方式 不能使用 Thread 类的 stop 方法来终止线程的执行 一 般要设定一个变量 在 run 方法中是一个循环 循环每次检查该变量 如果满 足条件则继续执行 否则跳出循环 线程结束 15 不能依靠线程的优先级来决定线程的执行顺序 16 synchronized 关键字 当 synchronized 关键字修饰一个方法的时候 该 方法叫做同步方法 17 Java 中的每个对象都有一个锁 lock 或者叫做监视器 monitor 当访 问某个对象的 synchronized 方法时 表示将该对象上锁 此时其他任何线程 都无法再去访问该 synchronized 方法了 直到之前的那个线程执行方法完毕 后 或者是抛出了异常 那么将该对象的锁释放掉 其他线程才有可能再去访 问该 synchronized 方法 18 如果一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论