01|小饶学编程之JAVA SE第一部分——面向对象(10抽象类和接口)


抽象类和接口

  • 一、抽象类
    • 1.1由来
    • 1.2概念
    • 1.3定义
    • 1.4语法规则
    • 1.5抽象方法跟子类的联系
  • 二、接口
    • 2.1概念
    • 2.2定义
  • 三、总结

一、抽象类 1.1由来 “用进废退”
多态的领域 重写的方法被子类覆盖 不可能被调用到 索性去掉方法体 退化为抽象方法。
1.2概念 将父类中被重写的方法的方法体删掉,用abstract修饰,就相当于将这个方法声明为一个抽象方法,顺带将该类声明为抽象类。前提该方法中的方法体没有任何实际的作用。
相对于对象而言,类本身就是一个抽象的概念,为了更进一步体现出类的抽象性,我们可以用关键字abstract去修饰类。
抽象方法:父类(定目标)和子类(实现目标)的分工。
1.3定义 父类:
public abstract class Fu { //抽象方法可以理解为上层制定的宏伟目标,下层必须落实 public abstract void a(); }

【01|小饶学编程之JAVA SE第一部分——面向对象(10抽象类和接口)】子类:
public abstract class Zi extends Fu { public void a() { System.out.println("公司上市了!"); } }

1.4语法规则
  • 1.被abstract修饰的类是抽象类。
  • 2.抽象类中可以有抽象方法,也就是被abstract修饰的方法,也可以没有。
  • 3.抽象方法没有方法体,只有方法声明。
  • 4.子类继承抽象类需要重写父类所有的抽象方法,否则,子类也必须声明为抽象类
  • 5.抽象类有构造方法,但是不能被显示调用,也就是不能实例化,或者说抽象类没有对象。
  • 6.抽象类的构造方法只在子类实例化时隐式调用。
  • 7.抽象类的使用一般是作为引用类型,指向非抽象的引用实例,体现出多态。
  • 8.构造方法和静态方法都不能(abstract)抽象修饰。(静态方法不能被子类覆盖(重写),一旦声明为抽象方法 将永远没有具体的实现)
1.5抽象方法跟子类的联系
  • (1)如果子类完全实现了父类的抽象方法,那么子类可以不用声明为抽象类。
  • (2)如果子类没有完全实现父类的抽象方法,那么子类必须声明为抽象类。
二、接口 2.1概念
  • 接口可以理解为定义的一组通用的组件,或者是功能模块。可替换,可拆卸。
  • 接口比抽象类更抽象,已经完全抽象得没边没影。
2.2定义
  • 和定义类的区别在于,将class关键字换成了interface
  • 所有的成员属性都是 public static final (公共的静态的常量)类型
  • 所有的方法都是:public abstract (公共的抽象方法)
public interface Hello1 { void a(); //接口的成员方法 int A=6; //接口的成员属性 }

三、总结
  • 1.抽象度:接口>抽象类>类>对象
  • 2.抽象类不能显示调用构造方法,不能直接创建对象,但可以在子类调用构造方法时隐式被调用。
  • 3.接口中只有抽象方法,没有构造方法和静态方法。
  • 4.接口:提供连接外部组件的口子。所以属性和方法都必须是public
  • 5.抽象类抽掉了对象的概念,接口进一步抽掉了类的概念。
  • 6.接口中的属性没有set/get,也就是不能封装,是static final类型,因为接口已经不再可以理解成类,而是一个组件。组件的属性在出厂时就已经定型了。
  • 7.多态的演变:
  1. Fu f=new Zi(); Fu是一个普通类
  2. Fu f=new Zi(); Fu是一个抽象类
  3. Fu f=new Zi(); Fu是一个接口,(使用最多)
  • 8.Static(静态)只修饰类的成员属性和方法,不修饰局部变量,也就是定义在方法体中的变量。静态方法表示类所特有的功能,这种功能的实现不依赖于类的具体实例,也不依赖于它的子类。因此,当前类必须为静态方法提供实现。(类加载时,会加载类的静态属性和方法)
  • 9.abstract(抽象)只修饰类和方法,不修饰属性和变量。
  • 10.抽象方法没有方法体:
    子类继承父类,往往会重写父类的方法,也就是会覆盖父类的方法,这个时候,父类的方法体基本没有用,所以直接不要方法体,用abstract修饰,变成抽象方法。再看静态方法,它是属于类空间,不可以被重写,所以自然不能省略掉方法体。构造方法也不能被重写,自然也不能被abstract修饰。

    推荐阅读