一、对抽象类的理解

抽象类的理解.png

二、抽象类细节

  • 定义一个抽象类 ```java abstract class Animal{

}

  1. - 抽象类无法实例化,因此**抽象类就是用来被子类继承的**
  2. - finalabstract不能一起使用,这两个关键字对立;因为final修饰的类无法被继承,而抽象类就是用来被继承的
  3. ```java
  4. final abstract class Animal{
  5. // 编译失败
  6. // java: 非法的修饰符组合: abstract和final
  7. }
  • 抽象类的子类可以是抽象类,也可以是非抽象类
  • 抽象类虽然无法实例化,但是抽象类有构造方法,这个构造方法是供子类使用的 ```java abstract class Animal{ public Animal(int i){
    1. // 这里加了个有参构造方法,此时系统就不会默认提供无参构造
    } }

class Bird extends Animal{ // 无法通过编译 // There is no default constructor available in ‘org.example.Animal’ // 说明抽象类中是默认存在一个无参构造方法的,这个构造方法是供子类使用的 // 子类在继承父类时,会在无参构造方法中使用super()调用父类的无参构造方法 }

abstract class Dog extends Animal{ // 无法通过编译 }

  1. - 抽象类关联到抽象方法的概念,抽象方法就是使用abstract修饰的并且没有方法体的方法
  2. - 抽象类中不一定要有抽象方法,但是抽象方法一定只能写在抽象类中
  3. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2396573/1625637553070-5cf73c92-6eff-42c8-a629-d3354abdcc6e.png#clientId=ub3a45c21-aefc-4&from=paste&height=248&id=u51dea296&margin=%5Bobject%20Object%5D&name=image.png&originHeight=496&originWidth=756&originalType=binary&ratio=1&size=41795&status=done&style=stroke&taskId=u44925500-93b9-4da9-ad8b-0a0cf5eadc1&width=378)
  4. - **一个非抽象类继承一个抽象类,必须实现抽象类中的抽象方法!!!**
  5. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2396573/1625637776775-ba22f962-fd77-4c47-b04b-23221ee50208.png#clientId=ub3a45c21-aefc-4&from=paste&height=126&id=uf8db6cc9&margin=%5Bobject%20Object%5D&name=image.png&originHeight=252&originWidth=981&originalType=binary&ratio=1&size=26016&status=done&style=stroke&taskId=u2732c371-3a73-4514-9f92-3ebb2ed371f&width=490.5)
  6. - 面向抽象编程,降低程序耦合度,提高程序的扩展力;这种编程思想符合OCP开闭原则
  7. ```java
  8. public class abstractTest {
  9. public static void main(String[] args) {
  10. // 多态
  11. // 父类型引用指向子类型对象
  12. Animal a = new Bird(); // 向上转型
  13. a.eat(); // 鸟儿飞翔!!!
  14. /*
  15. 编译时这个eat()方法是Animal的
  16. 运行时这个eat()方法是Bird的
  17. */
  18. }
  19. }
  20. abstract class Animal{
  21. public abstract void eat();
  22. }
  23. class Bird extends Animal{
  24. @Override
  25. public void eat() {
  26. System.out.println("鸟儿飞翔!!!");
  27. }
  28. }
  • 面试题:Java中凡是没有方法体的方法都是抽象方法(error
    • public native int hashCode();
    • 以上这个方法底层调用了C++写的动态链接程序库
    • native表示调用JVM本地程序