Kai1222 发表于 2022-4-10 15:55

Java中不可不知道的几个重要知识点

# ReviewDay 5

## 接口

### 接口是更加抽象的抽象类

- 接口不能被实例化
- 接口中所有的方法都是 *public* 方法
- 接口中的抽象方法可以不用abstract
- 接口的字段都是 *public static final* 的常量
- 除了抽象类,实现接口的类必须实现接口的所有方法

### 接口与抽象类

- 每个类只能继承一个类,但一个类可以同时实现多个接口
- 接口不能继承其他的类,但可以继承多个别的接口
    > interface A extends B, C{}

- #### 实现接口与继承类
- 接口与继承解决的问题不同
    > 继承价值主要在于解决代码的复用性和可维护性
    >
    > 接口价值主要在于设计号各种规范,让其他类实现这些方法
- 接口比继承更加灵活
- 接口一定程度上实现代码解耦

### 接口的多态特性

- 多态参数
- 多态数组
- 多态传递(实现的接口实现了另一个接口)

## ~~lambda 表达式~~

## 内部类

### 内部类的分类

- 定义在外部类的局部位置(方法中、代码块)
> (1)局部内部类 (有类名)
>
> (2)**匿名内部类**(没有类名)
- 定义在外部类的成员位置
> (1)成员内部类
>
> (2)静态内部类 (static)

### 局部内部类

- 可以直接访问内部类的所有成员,包括私有的
- 不能添加访问修饰符,相当于一个局部变量,但可以用final
- 作用域仅在定义它的方法或代码块
- 外部类和局部内部类的成员重名时,要访问外部类的成员时可以使用 (外部类名.this.成员)

### 匿名内部类

- 既是一个类的定义,同时本身也是一个对象
- 可以直接访问内部类的所有成员,包括私有的
- 不能添加访问修饰符,相当于一个局部变量
- 匿名内部类不能有构造器,但可以提供对象初始化代码块
- 作用域仅在定义它的方法或代码块
- 外部**其他类**不能访问匿名内部类
- 常用于参数传递
```java
//基于类的匿名内部类
Father father = new Father("jack") {
    @Override
    public void test() {
      //匿名内部类重写了方法
    }
}

//基于抽象类的匿名内部类
//基于接口的匿名内部类
new Comparator() {
    @Override
    public int compare() {
      //重写方法
    }
}
```

### 成员内部类

- 成员内部类定义外部类的成员位置,并且没有static
- 可以添加访问修饰符
- 作用域与其他成员变量一样
- 外部类访问成员内部类时须创建对象再访问
- 外部类和局部内部类的成员重名时,要访问外部类的成员时可以使用 (外部类名.this.成员)

### 静态内部类

- 定义于外部类的成员位置,并且有static修饰 (有static修饰的成员内部类)

## 异常

### 执行过程中所发生的异常事件可以分为两大类

- Error(错误):JVM无法解决的严重问题,如StackOverflowError和OOM
- Exception:因编程错误或偶然的外在因素导致的一般性问题
- 运行时异常
> 编译器检查不出来,一般是编程时的逻辑错误
- 编译异常
> 编译器要求的必须处置的异常,否则不能通过编译

!(http://pic.ruikai.ltd/img/202204101510019.png)

### 异常处理

- try-catch-finally
> 捕获异常,自行处理
1) 如果try块中没有出现异常,则执行try块中的所有语句,不再执行catch块,若有finally,最后还要执行finally块中语句
2) 如果出现了异常,则try块中剩下的语句不在执行,将执行catch块,最后执行finally块
```java
      try{
      return 1;
      } catch Exception e {
      return 2;
      } finally {
      return 3;
      }
      //try 块中没有出现异常,catch块不执行,因为有finally块中的return(finally必须执行),所以finally中return执行,try中return不执行
      
      try{
            //出现异常   
      return 1;
      } catch Exception e {
      return 2;
      } finally {
      return 3;
      }
      //try 中出现异常,try中return不再执行, 又因为finally有return,所以catch中return不执行,finally中return被执行
      
      try{
            //出现异常   
      return 1;
      } catch Exception e {
      int a = 1;   
      return a;
      } finally {
      a += 1;
      }
      //try 中出现异常, catch被执行,执行到return时会将 a = 1保存为临时变量 temp = 1;最后finally修改后再执行catch块中的语句,并将临时变量返回,而不是修改后的a
```   
- throws/throw
> 抛出异常,交给调用者处理
>
>throw和throws的区别
>!(http://pic.ruikai.ltd/img/202204101535916.png)

-try-with-resources(带资源的try语句)
```java
      try (Resource res = ...) //res实现了Closeable接口(AutoCloseable的子接口)
      {
            work with res ...   
      }
```
> try 退出时,会自动调用res.close(),自动关闭资源(无论是否出现异常)
>
> try-with-resource也可以有catch、finally语句,这些语句将在资源被关闭后执行
>

### 自定义异常

1) 自定义类继承Exception或RuntimeException
2) 继承Exception则属于编译异常
3) 继承RuntimeException则属于运行异常
```java
class AgeException extends RuntimeException {
    public AgeException(String message) {
      super(message);
    }
}
```

xiadongming 发表于 2022-4-10 16:53

fhefh 发表于 2022-4-10 18:01

Java多线程看不懂 目前Spring一把梭~

wml52pj 发表于 2022-4-10 19:01

已有的这些总结的可以,点赞
页: [1]
查看完整版本: Java中不可不知道的几个重要知识点