[关闭]
@MRsunhuimin 2019-07-24T11:20:33.000000Z 字数 4991 阅读 535

java (2019.07.23)

java基础

作者:孙慧敏

1. 抽象类

1.0 抽象类关键字:abstract

1.1 普通类VS抽象类

(1)普通类可以被实例化,普通类有方法体

 (2) 抽象类不能被实例化,抽象类没有方法体

1.2 抽象类与抽象方法的使用

(1)抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象类

(2)如果子类没有实现父类的所有抽象方法,子类必须被定义为抽象类

(3)没有抽象构造方法,也没有抽象静态方法

(4)抽象类中可以有非抽象的构造方法,创建子类的实例时可能调用

(5)抽象类不能实例化对象,抽象类本身也不能被实例化,只能被继承

(6)抽象类使用abstract来修饰

2. 接口

2.0 什么是接口?面向接口编程是什么?

(1)接口是一种“能力”

(2)在程序设计时,关心实现类有何能力,而不关心实现细节;面向接口的约定而不考虑接口的具体实现。

2.1 接口关键字:interface

2.2 接口特点:

(1)接口不可以被实例化

(2)实现类必须实现接口的所有方法

(3)实现类可以实现多个接口,使用implements,多个接口用逗号隔开

(4)接口中的变量都是静态常量,即 public static final

2.3 接口使用

(1)接口中的成员变量默认都是public static final的,必须显示初始化;

(2)接口中的方法默认都是public static的;

(3)接口没有构造方法,不能被实例化;

(4)一个接口不能实现另一个接口,但可以继承多个其他接口;

(5)一个类必须实现接口抽象方法(implements),除非这个类也是抽象类

2.4 接口知识练习

  1. //阅读代码,找出错误
  2. public interface MyInterface {
  3. public MyInterface(); //F(接口没有构造方法)
  4. public void method1(); //T
  5. public void method2(){ } //F(方法默认都public static)
  6. private void method3(); //F(private错误)
  7. void method4(); //T
  8. int method5(); //T
  9. int TYPE = 1; //T
  10. }

3. 抽象类vs接口

3.1 两者的异同以及使用原则

相同点:
    (1)都代表系统的抽象层

    (2)都不能被实例化

    (3)都能包含抽象方法

    (4)用于描述系统提供的服务,不必提供具体实现

不同点:
    (1)在抽象类中可以为部分方法提供默认实现,而接口中只能包含抽象方法

    (2)抽象类便于复用,接口便于代码维护

    (3)一个类只能继承一个直接的父类,但可以实现多个接口

使用原则:
    (1)接口做系统与外界交互的窗口
    (2)接口提供服务
    (3)接口本身一旦制定,就不允许随意修改
    (4)抽象类可完成部分功能实现,还有部分功能可作为系统的扩展点

3.2 总结

3.2.1 Java中的接口:
(1)属性全都是全局静态常量

(2)方法都是全局抽象方法

(3)无构造方法
3.2.2 一个类可以实现多个接口,非抽象类实现接口时必须实现接口中的全部方法
3.2.3 抽象类利于代码复用,接口利于代码维护

4. 异常

4.1 什么是异常?

    异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序

4.2 Java异常处理方式

    Java的异常处理是通过5个关键字来实现的:try、catch、finally、throw、throws

4.3 try-catch

  1. 第一种情况 :正常
  2. public void method(){
  3. try {
  4. // 代码段(此处不会产生异常)
  5. } catch (异常类型 ex) {
  6. // 对异常进行处理的代码段
  7. }
  8. // 代码段
  9. }
  1. 第二种情况:出现异常
  2. public void method(){
  3. try {
  4. // 代码段 1
  5. // 产生异常的代码段 2
  6. // 代码段 3
  7. } catch (异常类型 ex) {
  8. // 对异常进行处理的代码段4
  9. }
  10. // 代码段5
  11. }
  12. 异常是一种特殊的对象,类型为java.lang.Exception或其子类
  13. 异常处理过程:
  14. try代码块————————>发生异常后产生异常对象————————>异常类型匹配———————>(进入)catch代码块——————>程序继续执行
  1. 第三种情况:异常类型不匹配
  2. public void method(){
  3. try {
  4. // 代码段 1
  5. // 产生异常的代码段 2
  6. // 代码段 3
  7. } catch (异常类型 ex) {
  8. // 对异常进行处理的代码段4
  9. }
  10. // 代码段5
  11. }
  12. 异常处理过程:
  13. try代码块————————>发生异常后产生异常对象————————>异常类型匹配———————>程序中断运行(不进入catch代码块)

4.4 异常对象常用的方法

方法 说明
void printStackTrace() 输出异常的堆栈信息
String getMessage() 返回异常信息描述字符串,是printStackTrace()输出信息的一部分
Exception 异常层次结构的父类
ArithmeticException 算术错误情形,如以零作除数
ArrayIndexOutOfBoundsException 数组下标越界
NullPointerException 尝试访问 null 对象成员
ClassNotFoundException 不能加载所需的类
IllegalArgumentException 方法接收到非法参数
ClassCastException 对象强制类型转换出错
NumberFormatException 数字格式转换异常,如把"abc"转换成数字

4.5 try-catch-finally

在try-catch块后加入finally块

1. 无论是否发生异常都执行
2. 不执行的唯一情况:catch代码块中存在System.exit(1)
3. 通常用于释放资源
  1. //存在return的try-catch-finally块
  2. public void method(){
  3. try {
  4. // 代码段 1
  5. // 产生异常的代码段 2
  6. } catch (异常类型 ex) {
  7. // 对异常进行处理的代码段3
  8. return;
  9. }finally{
  10. // 代码段 4
  11. }
  12. }
  13. 异常处理过程:
  14. try代码块————————>发生异常后产生异常对象————————>异常类型匹配———————>进入catch代码块————————>进入并执行finally块————————>返回catch代码块————————>执行return退出方法

4.6 多重catch块

引发多种类型的异常:

    1. 排列catch 语句的顺序:先子类后父类 

    2. 发生异常时按顺序逐个匹配

    3. 只执行第一个与异常类型匹配的catch语句

4.7 小结

    try-catch-finally结构中try语句块是必须的,catch、finally语句块均可选,但两者至少出现之一

4.8 抛出异常

throw throws
生成并抛出异常 声明方法内抛出了异常
位于方法体内部,可作为单独语句使用 必须跟在方法参数列表后面,不能单独使用
抛出一个异常对象,且只能是一个 声明抛出异常类型,可以跟多个异常
  1. public void method(){
  2. try {
  3. // 代码段
  4. } catch (Exception e) {
  5. e.printStrackTrace();//输出异常
  6. throw new Exception("这是一个自定义的异常");
  7. }
  8. }

4.9 自定义异常

过程:

定义异常类————————>编写构造方法,继承父类的实现————————>实例化自定义异常对象————————>使用throw抛出

4.10 异常处理原则

1. 异常处理与性能

2. 异常只能用于非正常情况

3. 不要将过于庞大的代码块放在try中

4. 在catch中指定具体的异常类型

5. 需要对捕获的异常做处理

4.11 总结

1. 异常分为Checked异常和运行时异常

        1.1 Checked异常必须捕获或者声明抛出

        1.2 运行时异常不要求必须捕获或者声明抛出

2. try-catch-finally中存在return语句的执行顺序

3. finally块中语句不执行的情况

4. throw和throws关键字的区别

5. 开发打印机

墨盒:彩色、黑白
纸张类型:A4、B5
墨盒和纸张都不是打印机厂商提供的
打印机厂商要兼容市场上的墨盒、纸张

   分析:

   纸     -----接口  抽象方法   [输出纸张大小]
            A4纸 实现纸  输出A4
            B5纸 实现纸  输出B5

   墨盒 ----接口(抽象) 抽象方法   [输出墨盒颜色]
            黑白墨盒 实现墨盒 输出黑白
            彩色墨盒 实现墨盒 输出彩色

   打印机
            纸接口 a  ;
            墨盒接口  b ;

   打印方法
  1. package com.hz.printer_interface;
  2. /*
  3. * 纸张
  4. */
  5. public interface Paper {
  6. public abstract String paperSize () throws Exception;
  7. }
  1. package com.hz.printer_interface;
  2. /*
  3. * 墨盒
  4. */
  5. public interface InkBox {
  6. public abstract String boxColor() throws Exception;
  7. }
  1. package com.hz.printer_interface;
  2. /*
  3. * A4纸
  4. */
  5. public class A4paper implements Paper {
  6. @Override
  7. public String paperSize() throws Exception{
  8. return("A4纸");
  9. }
  10. }
  1. package com.hz.printer_interface;
  2. /*
  3. * B5纸
  4. */
  5. public class B5paper implements Paper {
  6. @Override
  7. public String paperSize() throws Exception{
  8. return ("B5纸");
  9. }
  10. }
  1. package com.hz.printer_interface;
  2. /*
  3. * 彩色墨盒
  4. */
  5. public class coloursBox implements InkBox {
  6. @Override
  7. public String boxColor() throws Exception{
  8. return ("彩色墨盒");
  9. }
  10. }
  1. package com.hz.printer_interface;
  2. /*
  3. * 黑白墨盒
  4. */
  5. public class bwBox implements InkBox {
  6. @Override
  7. public String boxColor() throws Exception{
  8. return ("黑白墨盒");
  9. }
  10. }
  1. package com.hz.printer_interface;
  2. /*
  3. * 打印机
  4. */
  5. public class printer {
  6. private Paper paper;
  7. private InkBox inkbox;
  8. public Paper getPaper() {
  9. return paper;
  10. }
  11. public void setPaper(Paper paper) {
  12. this.paper = paper;
  13. }
  14. public InkBox getInkbox() {
  15. return inkbox;
  16. }
  17. public void setInkbox(InkBox inkbox) {
  18. this.inkbox = inkbox;
  19. }
  20. /*
  21. * 定义一个show()方法用于输出结果
  22. * 定义当前类的对象调用接口的方法,用于传结果
  23. */
  24. public void show() throws Exception{
  25. System.out.println("使用"+this.inkbox.boxColor()+"墨盒在"+this.paper.paperSize()+"纸张上打印");
  26. }
  27. }
  1. package com.hz.printer_interface;
  2. public class print_test {
  3. public static void main(String[] args) throws Exception{
  4. try {
  5. printer pr = new printer();
  6. /*
  7. * 使用彩色墨盒墨盒在A4纸纸张上打印
  8. * 用接口new实现(类)
  9. */
  10. Paper p = new A4paper();
  11. InkBox i = new coloursBox();
  12. pr.setInkbox(i);
  13. pr.setPaper(p);
  14. pr.show();//调用show方法输出
  15. /*
  16. * 使用黑白墨盒墨盒在B5纸纸张上打印
  17. */
  18. Paper p1 = new B5paper();
  19. InkBox i1 = new bwBox();
  20. pr.setInkbox(i1);
  21. pr.setPaper(p1);
  22. pr.show();
  23. } catch (Exception e) {
  24. e.printStackTrace();//输出异常
  25. }
  26. }
  27. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注