3.3. 接口与抽象类

一. 抽象类

抽象类为什么无法实例化,无法创建对象?  
抽象类是:类和类之间有共同特征,将这些具有共同特征的类再进一步形成了抽象类。由于类本身是不存的,所以抽象类无法创建对象

1、什么是抽象类

类和类之间有共同特征,将这些具有共同特征的类再进一步形成了抽象类。由于类本身是不存的,所以抽象类无法创建对象【无法实例化】

2、抽象类属于什么类型?

抽象类也属于引用数据类型

3、抽象类怎么定义?

语法:

[修饰符列表] abstract class 类名{
    类体;
}

4、抽象类是无法实例化的,无法创建对象的,所以抽象类是用来被子类继承的。

5、final 与 abstract 不能联合使用,这两个关键字是对立的

6、抽象类的子类可以是抽象类

7、抽象类虽然无法实例化,但是抽象类有构造方法,这个构造方法是供子类使用的。

8、抽象类关联到一个概念:抽象方法。

抽象方法表示没有实现的方法,没有方法体的方法。

例如:public abstract void doSome (); 没有花括号

抽象方法特点是:

  • 特点 1:没有方法体,以分号结尾。
  • 特点 2:前面修饰符列表中有 abstract 关键字

9、抽象类中不一定有抽象方法,抽象方法必须在抽象类中。

重要结论:【必须背会】

一个非抽象的类继承抽象类,必须将抽象类中的抽象方法实现了。 这是 java 语法上强行规定的,必须的,否则编译器报错。 抽象类则不需要。

这里的覆盖或者重写,也可以叫做实现。(对抽象)

面向抽象编程

面向抽象编程,不要面向具体编程,降低程序的耦合度,提高程序的扩展力 这种编程思想符合 OCP 原则。

二. 接口

  • 接口也是一种引用数据类型。
  • 接口是完全抽象的。(抽象类是半抽象。)或者也可以说接口是特殊的抽象类。

1. 接口的基础语法

1.1. 接口的语法

[修饰符列表] interface 接口名 {
}
[修饰符列表] class 类名{
}

1.2. 接口支持多继承,一个接口可以继承多个接口

interface A{

}

interface B{

}

interface C extends A,B{

}

1.3. 接口中只包含两部分内容

  • 常量(不能修改)
  • 抽象方法

接口没有其它内容,只有以上两部分。

1.4. 接口中的所有元素都是 public 修饰的

1.5. 接口中的抽象方法定义时 :public abstract 修饰符可以省略

1.6. 接口中的方法都是抽象方法,所以接口中的方法不能有结构体和方法体

1.7. 接口中的常量的 public 、static、final 可以省略。

1.8. 类实现接口实现方法

基础语法: 类和类之间叫做继承,类和接口之间叫做实现。

语法结构:

  • 继承使用 extends 关键字完成。
  • 实现使用 implements 关键字完成。
interface MyMath{
    double PI=3.1415;
    int sum(int a,int b);
    int sub(int a,int b);
}

//正确写法
abstract class MyMathImp1 implements MyMath{
}

错误:MyMathImp1不是抽象的,并且未覆盖MyMath中的抽象方法
/*class MyMathImp1 implements MyMath{
}*/

修正:
class MyMathImp1 implements MyMath{
    public int sum(int a,int b){
        return a + b;
    }
    
    public int sub(int a,int b){
        return a - b;
    }
}

1.9. 当一个非抽象的类实现接口的话,必须将接口中所有的抽象方法全部实现(重点)

1.10. 面向接口的编程

//多态:父类型引用指向子类型的对象
//调用接口里面的方法(面向接口的编程)
MyMath mm = new MyMathImp1();
mm.sum(10,20);

1.11. 一个类可以实现多个接口

这种机制弥补了 java 中的一个缺陷:java 中的类和类只支持单继承。实际上单继承是为了简单而出现的,现实世界中存在多继承,java 中的接口弥补了单继承带来的缺陷。

1.12. 继承和实现同时存在 (extends 和 implements)

Extends 关键字在前,implements 关键字在后。

public class Test()
{
    public static void main(String[] args){
        Flyable f = new cat();//多态
        f.fly();//输出结果:***

}
class Animal{
}

interface Flyable{
    void fly();
}

class Cat extends Animal implements Flyable{
    public void fly(){
        System.out.println("***")
    } 
}

1.13. 使用接口写代码时,可以使用多态(父类型引用指向子类型对象)

2. 接口在开发中的作用(解耦合)

注意:接口在开发中的作用,类似于多态在开发中的作用。

多态:面向抽象编程,不要面向具体编程。降低程序的耦合度,提高程序的扩展力。

接口是不是完全的?

是的,而我们以后正好要求面向抽象编程。 面向抽象编程这句话以后可以修改为:面向接口编程。有了接口就有了可插拨。可插拔表示扩展力很强。不是焊接死的。

面向接口编程,可以降低程序的耦合度,提高程序的扩展力。符合 OCP 开发原则。 接口的使用离不开多态机制。(接口+多态才可以达到降低耦合度)

接口可以解耦合,解开的是调用者和实现者的耦合, 任何接口都有调用者和实现者。

  • 调用者面向接口调用。
  • 实现者面向接口编写实现。

三. 接口和抽象类的区别

1. 方法实现

  • 抽象类:可以包含抽象方法和非抽象方法(有实现体的方法)
  • 接口:在Java 8之前只能包含抽象方法;Java 8后可以包含默认方法(default)和静态方法;Java 9后还可以有私有方法

2. 继承关系

  • 抽象类:只支持单继承,一个类只能继承一个抽象类
  • 接口:支持多实现,一个类可以实现多个接口

3. 成员变量

  • 抽象类:可以包含实例变量和常量
  • 接口:只能包含常量(public static final)

4. 构造方法

  • 抽象类:可以有构造方法
  • 接口:不能有构造方法

5. 访问修饰符

  • 抽象类:成员可以使用各种访问修饰符(public、protected、private)
  • 接口:成员默认都是public的

6. 使用目的

  • 抽象类:强调的是”是什么”(is-a)关系,表示类之间的继承关系
  • 接口:强调的是”能做什么”(can-do)关系,表示类具有某种能力

7. 设计层次

  • 抽象类:对类的抽象,是一种模板设计
  • 接口:对行为的抽象,是一种行为规范

8. 使用场景选择

  • 当你拥有一些方法并且想要让它们中的一些有默认实现,同时又需要子类必须实现其他方法,使用抽象类
  • 当你想要定义一个契约/规范,而不关心实现细节,使用接口
  • 当你需要支持多继承关系时,使用接口
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇