java基础加强

一、     基础回顾

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>也可以,原因是ArrayListList的实现类,并且泛型的参数StringDate都是?这个通配符可以表示的。

对于这样的声明 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

      

. 表示当前文件夹

.. 表示上级文件夹 

 

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.    实现要求:

功能:

       显示所有联系人。

       添加一个联系人。

       删除一个联系人。

       修改一个联系人。

 

模型:

       联系人:

              姓名

              性别

电话

              QQ

              email

              地址

             

 

界面:

使用命令行。(后期改为使用HTML+CSS)

      

数据存储:

       使用文件。(后期改为使用数据库)

 

 

要求:

       写出来就可以,不管代码好坏,只要求功能!

 

交作业时间:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值