vlambda博客
学习文章列表

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

Java的几个重要知识点

接口

接口是更加抽象的抽象类

  • 接口不能被实例化

  • 接口中所有的方法都是 public 方法

  • 接口中的抽象方法可以不用abstract

  • 接口的字段都是 public static final 的常量

  • 除了抽象类,实现接口的类必须实现接口的所有方法

接口与抽象类

  • 每个类只能继承一个类,但一个类可以同时实现多个接口

  • 接口不能继承其他的类,但可以继承多个别的接口

    interface A extends B, C{}

  • 实现接口与继承类

    • 接口与继承解决的问题不同

      继承价值主要在于解决代码的复用性和可维护性

      接口价值主要在于设计号各种规范,让其他类实现这些方法

    • 接口比继承更加灵活

    • 接口一定程度上实现代码解耦

接口的多态特性

  • 多态参数

  • 多态数组

  • 多态传递(实现的接口实现了另一个接口)

lambda 表达式

内部类

内部类的分类

  • 定义在外部类的局部位置(方法中、代码块)

    (1)局部内部类 (有类名)

    (2)匿名内部类(没有类名)

  • 定义在外部类的成员位置

    (1)成员内部类

    (2)静态内部类 (static)

局部内部类

  • 可以直接访问内部类的所有成员,包括私有的

  • 不能添加访问修饰符,相当于一个局部变量,但可以用final

  • 作用域仅在定义它的方法或代码块

  • 外部类和局部内部类的成员重名时,要访问外部类的成员时可以使用 (外部类名.this.成员)

匿名内部类

  • 既是一个类的定义,同时本身也是一个对象

  • 可以直接访问内部类的所有成员,包括私有的

  • 不能添加访问修饰符,相当于一个局部变量

  • 匿名内部类不能有构造器,但可以提供对象初始化代码块

  • 作用域仅在定义它的方法或代码块

  • 外部其他类不能访问匿名内部类

  • 常用于参数传递

//基于类的匿名内部类
Father father = new Father("jack") {
   @Override
   public void test() {
       //匿名内部类重写了方法
  }
}

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

成员内部类

  • 成员内部类定义外部类的成员位置,并且没有static

  • 可以添加访问修饰符

  • 作用域与其他成员变量一样

  • 外部类访问成员内部类时须创建对象再访问

  • 外部类和局部内部类的成员重名时,要访问外部类的成员时可以使用 (外部类名.this.成员)

静态内部类

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

异常

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

  • Error(错误):JVM无法解决的严重问题,如StackOverflowError和OOM

  • Exception:因编程错误或偶然的外在因素导致的一般性问题

    编译器检查不出来,一般是编程时的逻辑错误

    编译器要求的必须处置的异常,否则不能通过编译

    • 编译异常

    • 运行时异常

异常处理

  • try-catch-finally

    捕获异常,自行处理

    1. 如果try块中没有出现异常,则执行try块中的所有语句,不再执行catch块,若有finally,最后还要执行finally块中语句

    2. 如果出现了异常,则try块中剩下的语句不在执行,将执行catch块,最后执行finally块

        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的区别

-try-with-resources(带资源的try语句)

        try (Resource res = ...) //res实现了Closeable接口(AutoCloseable的子接口)
      {
           work with res ...  
      }

try 退出时,会自动调用res.close(),自动关闭资源(无论是否出现异常)

try-with-resource也可以有catch、finally语句,这些语句将在资源被关闭后执行

自定义异常

  1. 自定义类继承Exception或RuntimeException

  2. 继承Exception则属于编译异常

  3. 继承RuntimeException则属于运行异常

class AgeException extends RuntimeException {
   public AgeException(String message) {
       super(message);
  }
}