0.写在前面

  1. 本笔记用作复习查看用,基础完整总结部分,基础不牢,地动山摇! | 🔥Java帝国之行🔥 | 地址 | | —- | —- | | Java核心编程总结(一、继承) 🔥 | https://blog.csdn.net/Augenstern_QXL/article/details/116209463 | | Java核心编程总结(二、抽象类与接口)🔥 | https://blog.csdn.net/Augenstern_QXL/article/details/116209487 | | Java核心编程总结(三、多态与内部类)🔥 | https://blog.csdn.net/Augenstern_QXL/article/details/116209507 | | Java核心编程总结(四、异常与线程) 🔥 | https://blog.csdn.net/Augenstern_QXL/article/details/116209529 | | Java核心编程总结(五、线程池与死锁)🔥 | https://blog.csdn.net/Augenstern_QXL/article/details/116209580 | | Java核心编程总结(六、常用API与集合)🔥 | https://blog.csdn.net/Augenstern_QXL/article/details/116209607 | | Java核心编程总结(七、Stream流)🔥 | https://blog.csdn.net/Augenstern_QXL/article/details/116209624 | | Java核心编程总结(八、IO输入输出流)🔥 | https://blog.csdn.net/Augenstern_QXL/article/details/116209648 | | Java核心编程总结(九、File文件类)🔥 | https://blog.csdn.net/Augenstern_QXL/article/details/116209674 | | Java核心编程总结(十、反射) 🔥 | https://blog.csdn.net/Augenstern_QXL/article/details/117744497 |

1.基础回顾+面试

1.1 抽象类

  1. 什么是抽象类?
    答:1. 父类知道子类一定要完成某个功能,但是每个子类完成的情况是不一样的
    2. 子类以后也只会用自己重写的功能,那么父类的该功能就可以定义成抽象方法,子类重写调用子类自己的就行
  2. 什么是抽象方法?
    答:没有方法体,只有方法签名,必须用abstract修饰。具有抽象方法的类必须定义成抽象类
  3. 抽象类的作用?
    答:为了被子类继承
    一个类继承了抽象类,必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类、
  4. 抽象类的特征?答:有得有失
    • 有得:抽象类得到了具有抽象方法的能力
    • 有失:抽象类失去了创建对象的能力(抽象类不能创建对象)
  5. 抽象类的注意事项和总结:

    • 抽象类不能创建对象,如果创建,编译无法通过而报错
      理解:假设创建了抽象类的对象,调用抽象方法,抽象方法没有方法体,无法执行
    • 抽象类一定有而且是必须有构造器,是提供给子类创建对象时,初始化父类成员使用的
      理解:子类的构造器中,有默认的super(),需要访问父类构造器
    • 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类
    • 抽象类的子类,必须重写完抽象父类中的所有抽象方法,否则子类也必须定义成抽象类
    • 抽象类存在的意义是为了被子类继承,抽象类体现的是模板思想。

      1.2 接口

  6. 什么是接口?
    答:1. 接口是更加彻底的抽象
    2. 在JDK1.8之前接口中只能是抽象方法和常量
    3. 接口体现的是规范思想,实现接口的子类必须重写完接口的全部抽象方法

  7. 接口中抽象方法和常量特征

答:接口中的抽象方法可以省略public abstract不写,默认会加上,如:

  • public abstract void run() == void run()

    接口中常量是可以省去public static final不写,默认会加上,如:

  • public static final String name = "小林" == String name = "小林"

    1. 什么是常量?
      答:常量指的是变量值只有一个,且在程序运行过程中不可更改值
      常量一般修饰符是:public static final
    2. 接口的定义格式
      1. 修饰符 interface 接口名称{
      2. // 在jdk1.8之前接口中只能是抽象方法和常量
      3. }
      4. interface 定义接口的核心关键字

      1.3 接口的基本实现

      口诀: 子类继承父类,实现类实现接口
  • 类与类是继承关系
  • 类与接口是实现关系,接口是被类实现的
  • 实现接口的类称为:实现类
  • 一个类实现接口必须重写完接口中的全部抽象方法,否则这个类要定义成抽象类(一个类继承抽象类,必须重写完抽象类的所有抽象方法,否则这个类要定义成抽象类)
  • 类实现接口的格式: ```java 修饰符 class 实现类名称 implements 接口1,接口2,接口3,…..{

}

implements: 类实现接口的关键字

  1. - 类于类是单继承关系,类与接口是多实现关系,接口与接口是多继承关系
  2. - 一个类只能继承一个直接父类
  3. - 一个类可以同时实现多个接口
  4. - 一个接口可以同时继承多个接口
  5. - 一个类实现多个接口,必须重写完全部接口中的全部抽象方法,否则这个类要定义成抽象类
  6. <a name="z359z"></a>
  7. ## 1.4 JDK1.9之后(了解)
  8. - JDK1.8之前,接口中只能是抽象方法和常量
  9. - JDK1.8之后接口不再纯洁,新增了三个方法
  10. - 默认方法:就是实例方法
  11. - 必须用`default`修饰
  12. - 默认会加`public`修饰
  13. - `public default void run()` == `default void run()`
  14. - 只能用接口的实现类的对象来调用
  15. - 静态方法
  16. - 可以直接加`static`修饰
  17. - 默认会加`public`修饰
  18. - `public static void run()` == `static void run()`
  19. - 接口的静态方法只能用接口的类名称本身调用
  20. - 私有方法(JDK1.9开始才支持)
  21. - 其实就是私有的实例方法,必须加`private`修饰
  22. <a name="dnFZe"></a>
  23. ## 1.5 实现多个接口的使用注意事项
  24. 1. 如果实现了多个接口,多个接口中存在同名的静态方法并不会冲突<br />原因是只能通过各自接口名访问静态方法
  25. 1. 当一个类,既继承了一个父类,又实现了若干个接口时,父类中成员方法和接口中的默认方法重名,子类就近选择执行父类的成员方法
  26. 1. 当一个类实现多个接口时,多个接口中存在同名的默认方法,实现类必须重写这个方法
  27. 1. 接口中,没有构造器,不能创建对象<br />接口是更彻底的抽象,连构造器都没有,自然不能创建对象!<br />构造器:初始化一个类的对象并返回引用
  28. <a name="SuRZP"></a>
  29. ## 1.6 代码块
  30. 代码块按照有无`static`修饰分为:静态代码块,实例代码块
  31. - 静态代码块
  32. - 必须用`static`修饰,属于类,会与类一起优先加载,而且自动触发执行一次!
  33. - 静态代码块可以用于执行类的方法之前进行静态资源的初始化操作
  34. - 格式:
  35. ```java
  36. static{
  37. }
  • 实例代码块
    • 必须无static修饰,属于类的每个对象,会与类的每个对象一起加载,每次创建对象的时候,实例代码块就会触发执行一次
    • 实例代码块可以用于初始化实例资源
    • 实例代码块的代码实际上是提取到每个构造器中去执行的(扩展和了解)

      1.7 final关键字

  1. final修饰类: 类不能被继承了
  2. final修饰方法:方法不能被重写
  3. final修饰变量:变量有且仅能被赋值一次

成员变量和局部变量

  • 静态成员变量:
    • static修饰,属于类,只加载一份
    • final修饰静态成员变量,变量变成了常量
  • 实例成员变量: 无static修饰,属于每个对象,与对象一起加载
  • 局部变量: 在方法中,构造器中,代码块中,for循环中的变量,用完作用范围就消失了
    • final修饰局部变量:让值被固定或者说保护起来,执行过程中防止被修改 ```java // 1.final修饰类 final class Animal{

} // 2.final修饰局部变量 { final int age = 10; }

// 3.

  1. <a name="cw5ae"></a>
  2. ## 1.8 单例(重点!!)
  3. 1. **什么是单例?**<br />答:单例的意思是一个类永远只存在一个对象,不能创建多个对象
  4. 1. **为什么要用单例?**<br />答:开发中很多类的对象我们只需要一个,对象越多占内存越多
  5. 1. **如何实现单例?**
  6. 答:单例的实现方法目前有两种方式:
  7. - 饿汉单例设计模式:通过类获取单例对象的时候,对象已经提前做好了
  8. - 懒汉单例设计模式:通过类获取单例对象的时候发现没有对象才会去创建一个对象
  9. (**这里需要会手写两种单例源码!!!!!!!,在下方会有源码与步骤,面试设计模式必问!**)
  10. <a name="8gBFL"></a>
  11. ## 1.9 枚举类
  12. 1. **枚举类的作用?**<br />答:枚举用于做信息标志和信息分类
  13. 1. **枚举类的特点**答:
  14. - 枚举类是`final`修饰的,不能被继承
  15. - 枚举类的第一行罗列的是枚举类的对象,而且使用常量存储的
  16. - 所以枚举类的第一行写的都是常量名称,默认存储了枚举对象
  17. - 枚举类的构造器默认是私有的
  18. - 枚举类相当于是多例设计对象
  19. ```java
  20. public class EnumDemo01 {
  21. public static void main(String[] args) {
  22. Sex s1 = Sex.BOY;
  23. Sex s2 = Sex.GIRL;
  24. }
  25. }
  26. enum Sex{
  27. BOY,GIRL;
  28. }

2. 面试

2.1 抽象类

  • 面试题:抽象类是否有构造器,抽象类是否可以创建对象?
    答:1. 抽象类作为类一定有构造器,而且抽象类必须有构造器,是提供给子类创建对象调用父类构造器使用的,除此之外,类中有的成分,抽象类都具备(成员变量,成员方法,构造器,内部类,代码块)
    2. 抽象类虽然有构造器但是抽象类不能创建对象
  • 面试题:抽象类中的构造器可以私有吗?
    答:从代码编译角度,抽象类中的构造器可以私有,但是子类继承默认调用父类构造器会报错
    因为私有只能在本类中使用,所以抽象类中构造器私有没有意义。 ```java // 反证法:假如抽象类可以创建对象!

public class AbstractDemo { public static void main(String[] args){ // Animal a = new Animal(); // 报错 // a.run();抽象方法不能执行,因为它没有方法体,所以抽象类不能创建对象 } }

abstract class Animal{ private String name; //默认无参构造器 public Animal(){

  1. }
  2. //抽象方法
  3. public abstract void run();
  4. //实例方法
  5. public void test(){
  6. }
  7. //静态方法
  8. public static void Addr(){
  9. }
  10. public String getName() {
  11. return name;
  12. }
  13. public void setName(String name) {
  14. this.name = name;
  15. }

}

  1. - **抽象类存在的意义**<br />答: 1. 抽象类就是为了被子类继承(就是为了派生子类),否则抽象类毫无意义<br /> 2.抽象类体现的是模板思想,部分实现,部分抽象,可以设计模板设计模式<br /> 理解:抽象类中已经实现的是模板中确定的成员,抽象类不确定如何实现的定义成抽象方法,交给具体的子类去实现
  2. <a name="7w5m8"></a>
  3. ## 2.2 代码块
  4. 静态代码块和实例代码块的作用?<br />答:<br />静态代码块有`static`修饰,属于类,会与类一起优先加载,而且自动触发执行一次!静态代码块可以用于执行类的方法之前进行静态资源的初始化操作<br />实例代码块无`static`修饰,属于类的对象,会与类的每个对象一起加载,每次创建对象的时候,实例代码块就会触发执行一次,实例代码块可以用于初始化实例资源
  5. <a name="w603r"></a>
  6. ## 2.3 final,abstract关键字
  7. 1. 请问`abstract``final`的关系是什么?<br />答:互斥关系,不能同时出现修饰成员!<br />`abstract` 修饰类,类是抽象类,必须被继承<br />`final` 修饰类,类不能被继承<br />`abstract` 修饰方法,方法必须被重写<br />`final` 修饰方法,方法不能被重写
  8. <a name="rS5qZ"></a>
  9. ## 2.4 变量
  10. 1. 变量有几种?
  11. 答:成员变量和局部变量
  12. - 静态成员变量: `static`修饰,属于类,只加载一份
  13. - 实例成员变量: `static`修饰,属于每个对象,与对象一起加载
  14. - 局部变量: 只在方法中,构造器中,代码块中,for循环中,用完作用范围就消失了
  15. - `final`修饰局部变量:让值被固定或者说保护起来,执行过程中防止被修改
  16. <a name="pimkM"></a>
  17. ## 2.5 写一个饿汉单例设计模式
  18. 饿汉单例设计模式:通过类获取单例对象的时候,对象已经提前做好了<br />步骤:
  19. 1. 定义一个单例类
  20. 1. 把类的构造器私有
  21. 1. 定义一个静态成员变量用于存储一个对象!(饿汉单例在返回对象的时候,对象要已经做好)
  22. 1. 定义一个方法返回单例对象
  23. ```java
  24. // 定义一个单例类
  25. class SingleInstance01{
  26. // 2.定义一个静态成员变量用于存储一个对象
  27. public static SingleInstance01 ins = new SingleInstance01();
  28. // 1.把类的构造器私有,构造器只能在本类中访问
  29. // 私有的无参构造器
  30. private SingleInstance01(){
  31. }
  32. // 3.提供一个方法返回单例对象
  33. public static SingleInstance01 getInstance(){
  34. return ins;
  35. }
  36. }

2.6 写一个懒汉单例设计模式

懒汉单例模式:通过类获取单例对象的时候发现没有对象才回去创建一个对象
步骤:

  1. 定义一个单例类
  2. 把类的构造器私有
  3. 定义一个静态成员变量用于存储一个对象(懒汉单例不能直接创建对象,必须需要的时候才去创建)
  4. 定义一个方法返回单例对象,判断对象不存在才创建一次,存在直接返回

    1. // 定义一个单例类
    2. class SingleInstance2{
    3. //定义一个静态成员变量用于存储一个对象!
    4. public static SingleInstance2 ins;
    5. // 1.把类的构造器私有
    6. private SingleInstance2(){
    7. }
    8. // 3.通过方法返回一个对象,第一次不存在对象才创建一个返回
    9. public static SingleInstance2 getInstance(){
    10. if(ins == null){
    11. //第一次来取对象,创建一个对象
    12. ins = new SingleInstance2();
    13. }
    14. return ins;
    15. }
    16. }