一、 基础回顾
1. 集合
1.1. 集合的类型与各自的特性
| 特性 | 常用的实现类 |
数组 | 固定长度。 只能放同一类型。 能放基本类型或对象类型。 |
|
List | 可变长度。 只能放对象类型。 有序。 元素可以重复。 | ArrayList用数组实现的。 LinkedList用链表实现的。可以实现栈或队列。 |
Set | 可变长度。 只能放对象类型。 无序(有的有序)。 元素不可以重复。 | HashSet无序。 TreeSet自然排序 LinkedHashSet 保持插入的顺序。 |
Map | 可变长度。 只能放对象类型。 无序(有的有序)。 Key不可以重复。 | HashMap 无序。 Hashtable 无序,线程安全。 TreeMap (Key)自然排序 LinkedHashMap 保持插入的顺序。 Properties 对应.properties配置文件。 |
注:重复的元素是指两个对象的hashCode()与equals()都相等。
1.2. 遍历集合
1.2.1. 遍历集合的几种方式
1, 使用迭代器Iterator的方式。
2, 使用增强for循环的方式。
3, 如果有下标,则可以使用下标的方式。
1.2.2. 遍历数组
1.2.3. 遍历List
1.2.4. 遍历Set
1.2.5. 遍历Map
2. IO流
2.1. IO流的分类
| 输入流 | 输出流 | 说明 |
字节流 | InputStream | OutputStream | 字节流是处理字节的(二进制) |
字符流 | Reader | Writer | 字符流是处理字符的 |
注:这几个类都是抽象类。
2.2. 读文件的代码
2.3. 拷贝文件的代码
3. 多线程
3.1. 启动线程方式
1, 自定义的类继承Thread类。
使用代码为new MyThread().start()
2,自定义的类实现Runnable接口。
使用代码为new Thread(new MyRunnable()).start
3.2. 代码
以下代码是分别用两种方式启动线程(还是用到了匿名内部类)
4. Socket网络编程
4.1. 网络通讯的三要素
IP地址
Port 端口号
通讯方式: TCP 或 UDP
4.2. TCP服务器端代码
4.3. TCP客户端代码
5. Properties类与配置文件
5.1. Properties配置文件说明
Properties类对应.properties文件。文件内容是键值对,键值对之间使用"="或空格隔开。开头是"#"的表示注释
Properties类在加载.properties文件时使用的iso8859-1的编码。所以这个文件中的中文要特殊处理:如果这个配置文件中有中文就必须要进行转义,使用native2ascii.exe命令操作:
native2ascii d:/my.properties d:/my2.properties
使用Properties类中的load(InputStream) 方法可以加载配置文件,使用其中的store(OutputStream) 方法可以保存配置到指定文件。
更多的信息可以看Properties类的API文档。
5.2. 加载配置文件
5.3. 写配置文件
5.4. 使用Properties类
二、 基础加强
1. 可变参数
1.1. 可变参数说明
1, 对内(方法内部使用):就是一个数组。
如果传递了0个参数,则这个数组不为null,只是长度为0。
2, 对外(外部调用这个方法):直接写0个或1个或多个参数值,或是传递一个数组。
1.2. 示例代码
2. 泛型
2.1. 怎么定义泛型的类或方法
说明:
1, 类或接口:把类型参数的声明放在类或接口的名字后面。
2, 方法:把类型参数的声明放到返回值的前面。
2.1.1. 泛型类/接口示例
2.1.2. 泛型方法示例
2.2. 怎么使用泛型的类或方法
注意:
在声明一个类型时,写为 MyClass mc = new MyClass(),因为Object是MyClass的父类,所以也可以这样写 Object o = new MyClass()。这时注意左边的是引用时声明的类型,右边的值只要是符合这个声明就可以,所以可以是这个类的实例,也可以是这个类的子类的实例。所以代码List<?> list这样的声明在右边可以是什么样的实例呢?new ArrayList<String>()可以!new ArrayList<Date>也可以,原因是ArrayList是List的实现类,并且泛型的参数String或Date都是”?”这个通配符可以表示的。
对于这样的声明 List<?> list ,你是不能向这个集合中添加元素的,因为不知道这个变量引用的集合具体声明成了什么样的实例。也可能是ArrayList<String>,也可能是ArrayList<Date>,所以向这个集合中添加什么都可能会有问题。
既然不能添加元素,那这样声明有什么用呢?通常这样声明放到方法的参数中,例如public void printAllElements(Collection<?> coll) 这样的声明,这个方法中只会使用这个集合中的元素,而不会向集合中添加元素。
2.3. 通配符、上限、下限。
| 规则 | 说明 |
通配符 | ? | 表示任意类型 |
上限 | ? extends MyObj | 表示所有MyObj的子类,包括MyObj类 |
下限 | ? super MyObj | 表示所有MyObj的父类,包括MyObj类 |
3. 反射
3.1. 反射技术说明
类字节码文件是在硬盘上存储的,是一个个的.class文件。我们在new一个对象时,JVM会先把字节码文件的信息读出来放到内存中,第二次用时,就不用在加载了,而是直接使用之前缓存的这个字节码信息。
字节码的信息包括:类名、声明的方法、声明的字段等信息。在Java中“万物皆对象”,这些信息当然也需要封装一个对象,这就是Class类、Method类、Field类。
通过Class类、Method类、Field类等等类可以得到这个类型的一些信息,甚至可以不用new关键字就创建一个实例,可以执行一个对象中的方法,设置或获取字段的值,这就是反射技术。
3.2. Class类
假设有一个Person类。
5.4.1. 获取Class对象的三种方式
5.4.2. 通过Class类获取类型的一些信息
5.4.3. 通过Class类获取类型中的方法的信息
5.4.4. 通过Class类获取类型中的字段的信息
3.3. Method类
3.4. Field类
3.5. 操作私有的成员方法或成员变量(字段)
对于方法也是一样:
1, 使用personClass.getDeclaredMethod()方法可以获取到私有的方法。
2, 通过执行method.setAccessible(true);就可以调用这个私有的方法了。
3.6. 判断成员方法或成员变量(字段)的修饰符
示例代码:
3.7. 反射的实用案例
4. 使用数字的每一个二进制位表示一种状态的技巧
int 32Bit
long64Bit
0x1 0001 public
0x2 0010 final
0x4 0100 static
0x8 1000
0101
&0100
----------
0100
5. 文件路径
5.1. 绝对路径
以根目录或某盘符开头的路径(或者说完整的路径)
例如:
l c:/a.txt (Windows操作系统中)
l c:/xxx/a.txt (Windows操作系统中)
l /var/xx/aa.txt (Linux操作系统中)
5.2. 相对路径
相对于当前路径的一个路径。例如当前文件夹为c:/abc时:相对路径a.txt表示c:/abc/a.txt,相对路径xx/a.txt = c:/abc/xx/a.txt
l . 表示当前文件夹
l .. 表示上级文件夹
5.3. Java程序中的相对路径
在Java程序中使用File时写相对路径,是指相对于执行java命令时当前所在的文件夹。
测试代码:
在命令行中使用cd命令切换到不同的路径下试试,可以看到以上所说的效果。
在Eclipse中,当前路径是工程的根目录。
5.4. classpath路径
5.4.1. classpath路径说明
在Java程序中,一般情况下使用绝对路径还是相对路径都不太合适,因为Java程序的jar包所放的位置不确定,执行java程序时当前的路径也不确定,所以不合适。一般在Java程序中我们会把资源放到classpath中,然后使用classpath路径查找资源。
5.4.2. 获取classpath中的资源(InputStream)
5.4.3. 获取classpath中的资源的完整路径
注意:
使用class.getResource()方法得到的路径已经进行了URL编码,所以在使用前需要先进行URL解码才可以。
6. Junit单元测试
6.1. Junit单元测试框架的基本使用
一、搭建环境:
导入junit.jar包(junit4)
二、写测试类:
0,一般一个类对应一个测试类。
1,测试类与被测试类最好是放到同一个包中(可以是不同的源文件夹)
2,测试类的名字为被测试类的名字加Test后缀。
三:写测试方法:
0,一般一个方法对应一个单元测试方法。
1,测试方法的名字为test前缀加被测试方法的名字,如testAddPerson()。
2,单元测试方法上面要加上@Test注解(org.junit.Test)!!!!!!!!!!!!!!
3,单元测试方法不能有参数,也不能有返回值(返回void)!
四、测试方法的基本使用:
1,可以单独执行一个测试方法,也可以一次执行所有的、一个包的、一个类中所有的测试方法。
2,执行完后,显示绿色表示测试成功;显示红色表示测试失败(抛异常后会测试失败)。
6.2. Assert断言工具类
其中有一些静态的工具方法(不符合期望就抛异常):
assertTrue(...) 参数的值应是true
assertFalse(...) 参数的值应是false
assertNull(...) 应是null值
assertNotNull(...) 应是非null的值
assertSame(...) 使用==比较的结果为true(表示同一个对象)
AssertNotSame(...) 使用==比较的结果为false
assertEquals(...) 两个对象equals()方法比较结果为true
assertArrayEquals(...) 数组中的元素分别equals()结果为true
6.3. 用于准备环境、清理环境的方法
@Test
表示单元测试方法。
@Before
所修饰的方法应是非static的(且没有参数,返回值为void)。
表示这个方法会在本类中的每个单元测试方法之前都执行一次。
@After
所修饰的方法应是非static的(且没有参数,返回值为void)。
表示这个方法会在本类中的每个单元测试方法之后都执行一次。
@BeforeClass
所修饰的方法应是static的(且没有参数,返回值为void)。
表示这个方法会在本类中的所有单元测试方法之前执行,只执行一次。
@AfterClass
所修饰的方法应是static的(且没有参数,返回值为void)。
表示这个方法会在本类中的所有单元测试方法之后执行,只执行一次。
三、 调试程序
1. 查看异常的方法
1.1. 抛出的异常是什么结构
有一个类:
如果执行其中的main()方法,则会抛如下异常:
从中可以了解:
1, 最后一个Caused by才是需要解决的异常,上面的都是包装捕获到的异常又抛出的。
2, 第一个at...指定的代码位置是异常真正抛出的地方,下面的at...是指定哪行代码调用的上面这个方法。
1.2. 解决异常的方法
1, 看最后一个Caused by,看异常类型与异常消息,可以得到这是一个什么错。
2, 看第一个at...,可以知道错在什么地方,如果:
a) 是自己的代码,则就是这里有错,去检查修改即可。
b) 别人的代码,如JDK、Spring、Hibernate等,一般不是他们的代码有错,而是自己给他传的参数有问题。
3, 如果出错的第一个at...是别人的代码,则:
a) 这时再向下找,找到第一行自己的代码,检查这里传递的参数并改正即可。
b) 如果向下找不到自己的代码调用,或是自己的代码中没有传递参数,则就是配置文件中的配置有问题,检查相关配置并改正即可。
2. 使用Debug调试程序
1,在源代码中打断点。
2,使用Debug方式运行程序。
3, 查看变量的值。
快捷键:
F5(跳入)
F6(跳过)
F7(跳出)
四、 作业:《通讯录》项目
1. 界面草图:
2. 实现要求:
功能:
显示所有联系人。
添加一个联系人。
删除一个联系人。
修改一个联系人。
模型:
联系人:
姓名
性别
电话
地址
界面:
使用命令行。(后期改为使用HTML+CSS)
数据存储:
使用文件。(后期改为使用数据库)
要求:
写出来就可以,不管代码好坏,只要求功能!
交作业时间: