一、抽象类和接口
- 抽象类使用abstract修饰,不能实例化。
- 抽象类中可以有零到多个抽象方法。抽象方法使用abstract关键字修饰,没有方法体。
- 如果非抽象类继承抽象类,则必须实现父类的所有的抽象方法,否则子类还是一个抽象类。
- 用final关键字修饰的类,不能再被继承。用final修饰的方法,不能被子类重写。用final关键字修饰的变量将变成常量,只能在初始化时进行赋值,不能在其他地方修改。
- 接口中的属性都是全局静态变量。自JDK1.8起,在接口中可以定义的方法包括抽象方法、静态方法和默认方法。
- 类只能继承一个父类,但是可以实现多个接口。Java通过实现接口可以达到多重继承的效果。
- 接口表示一种约定,也表示一种能力。接口体现了约定和实现相分离的原则。通过面向接口编程,可以降低代码间的耦合性,提高代码的可扩展性和可维护性。
二、异常
- 异常时有Java应用程序抛出和处理的非严重错误,它可以分为运行时异常和Checked异常两大类。
- Checked异常必须捕获或声明抛出,否则无法通过编译。运行时异常不要求必须捕获或声明抛出。
- Java异常处理是通过五个关键字实现的:try、catch、finally、throw和throws。其功能如下。
1、try:用于监听。将可能抛出异常的代码放在try语句块之内,当try语句块内发生异常时,异常就被抛出。
2、catch:用于捕获异常。catch语句用来捕获try语句块中发生的异常。
3、finally:finally语句块总是会被执行。它主要用于回收在try语句块里打开的资源(如数据库连接、网络连接和磁盘文件)。
4、throw:用于抛出异常。
5、throws:用于声明方法中可能抛出的异常。在该方法中可以不强制进行异常处理,如果出现了异常,则交给调用者进行处理。 - 即是在try块、catch块中存在return语句,finally块中的语句也会被执行。finally块中的语句不被执行的唯一情况是在异常处理代码中执行System.exit(1)方法。
- 可以在一个try块后跟随多个catch块,分别处理不同的异常,但排列顺序必须是从特殊到一般,最后一个一般为Exception类。
- Log4j 2 是一个优秀的日志记录工具,常用的使用方式是配置log4j2.xml文件,用来设置日志的输出级别、目的地和输出格式。
三、集合框架
- 集合弥补了数组的缺陷,它比数组更灵活更实用,可大大提高软件的开发效率,而且不同的集合可用于不同场合。
- Java的集合类主要由两个接口派生而出:Collection接口和Map接口及相关的工具类,这两个接口又包括了一些子接口或实现类。其中,Collection接口又包含了两个子接口——List接口和Set接口,另外一个重要接口是Map接口。
1、Collection接口存储一组不唯一、无序的对象。
2、Set接口继承Collection接口,存储一组唯一、无序的对象。
3、List接口继承Collection接口,存储一组不唯一、有序的对象。
4、Map接口存储一组成对的键-值对象,提供从key到value的映射。key不要求有序,不允许重复;value同样不要求有序,但允许重复。 - Iterator为集合而生,专门实现集合的遍历。它隐藏了各种集合实现类的内部细节,提供了遍历集合的统一编程接口。
- ArrayList类和数字采用相同的存储方式,它的优点在于遍历元素和随机访问元素的效率比较高。
- LinkedList类采用链表存储方式,优点在于插入、删除元素时效率比较高。
- HashMap类是最常见的Map实现类,它的存储方式是哈希表,优点是查询指定元素效率高。
- 使用泛型集合在创建集合对象时指定集合中元素的类型,在从集合中取出元素时无需进行强制类型转换,避免了ClassCastException异常。
四、实用类
- 枚举可以使代码更易于维护,有助于确保为变量指定合法的、期望的值。
- 枚举易于编程时输入,使用枚举赋值,只需输入枚举名和 “ . ”,就可显示所有枚举值。
- 枚举使代码更加清晰,允许用描述性的名称表示数据,使用时直观方便。
- 包装类是指将基本数据类型封装到一个类中,也就是将基本类型包装成一个类类型。Java程序设计语言为每一种基本类型都提供了一个包装类,而这些包装类就在java.lang包中,共有八个包装类,包含Boolean、Character、Byte、Short、Integer、Long、Float、Double。
- Java基本数据类型变量和包装类对象之间的转换较烦琐,从JDK1.5之后提供了自动装箱和自动拆箱功能。
1、自动封箱:把基本数据类型变量直接转换为对应的包装类对象,或者转换为Object对象。
2、自动拆箱:与自动装箱相反,将包装类对象转换为对应的基本类型变量。 - 在JDK1.8中,日期和时间的类都位于Java.time包中。
1、LocalDate类、LocalTime类、LocalDateTime类的实例是不可变的对象,它提供了简单的日期或时间。
2、使用DateTimeFormatter类进行日期格式化处理,该类位于java.time.format包中。日期类中的format()方法用于将日期格式化为字符串,该方法接收一个DateTimeFormatter对象。 - Random类用于生成随机数。它位于java.util包中,每当需要以任意或非系统方式生成数字时,就使用此类。
五、多线程
- 多线程允许程序员编写出可最大程度利用CPU的高效程序。
• 在Java程序启动时,一个线程立刻运行,该线程通常被称为程序的主线程。主线程是产生其他子线程的线程。
• 通常,主线程必须最后完成运行,因为它执行各种关闭动作。 - 可通过两种方式创建线程。
• 声明一个继承了Thread类的子类,在此子类中,重写Thread类的run()方法。
• 声明一个实现Runnable接口的类,然后实现run()方法。 - 每一个线程均会处于新建、就绪、运行、阻塞、死亡五种状态之一。
- 在Java实现的多线程应用程序中,可以通过调用Thread类中的方法实现对线程类对象的操作。
• 调用线程的优先级:在同等情况下,优先级高的线程会获得较多的运行机会,优先级低的线程则相反。Java线程优先级用1~10的整数表示。
• 线程休眠:sleep(long millis)方法使线程转到阻塞状态。
• 线程的强制运行:join()方法可以让某一线程强制运行。
• 线程礼让:yield()方法,暂停当前正在执行的线程类对象,把执行机会让给相同或更高优先级的线程。 - 当多个线程类对象操作同一共享资源时,要使用synchronized关键字进行资源的同步处理,可以使用同步代码块或同步方法实现线程同步。