Java抽象类和接口

本课目标

掌握抽象类和抽象方法的使用

掌握接口的基础知识

理解接口表示”一种能力“的含义

理解接口表示”一种约定“的含义

抽象类和接口的区别

一、抽象类

1.抽象类的基本概念

抽象思维,是人类思维达到高级阶段产生的一种能力。抽象类是为了继承而存在的,如果定义了一个抽象类,却不去继承它,那么就相当于白白创建了这个抽象类,因为你不能用它来做任何事。

对于一个父类,如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明位 abstract(抽象) 方法,此时这个类也就成为了 abstract  类。

2.抽象类的定义语法:访问修饰符  abstract  Class  ClassName{ }

抽象类和普通类的区别:

  • 抽象类要用 abstract  修饰
  • 普通类可以实例化,抽象类不能实例化
  • 如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为  abstract  类。

3.抽象方法

访问修饰符 abstract  Class ClassName {

    访问修饰符  abstract  返回值类型  方法名 (参数列表....)

}

抽象方法和普通方法的区别

  • 普通方法必须要有方法体,抽象方法不能有方法体(大括号也没有)
  • 抽象方法要用 abstract 修饰
  • 抽象方法必须存在于抽象类中

4.抽象类和抽象方法的使用

  • 抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象类
  • 如果子类没有实现父类的所有抽象方法,子类必须被定义为抽象类
  • 没有抽象构造方法,也没有抽象静态方法
  • 抽象类中可以有非抽象的构造方法,创建子类的实例时可以调用

练习1:模拟愤怒的小鸟

public abstract class Bird {
    public void fly(){
        System.out.println("弹射!起飞");
    }
    public void cry(){
        System.out.println("┗|`O′|┛ 咻~~");
    }

    public abstract void attack();//攻击
}
public class FissionBird extends Bird {
    public void attack(){
        System.out.println("******分裂攻击******");
        System.out.println("咻咻咻");
    }
}
public class RocketBird extends Bird {
    public void attack(){
        System.out.println("******加速冲撞******");
        System.out.println("咻...砰");
    }
}
public class TestBird {
    public static void main(String[] args) {
        Bird fission = new FissionBird();
        fission.fly();
        fission.cry();
        fission.attack();
        System.out.println();
        Bird rocketBird = new RocketBird();
        rocketBird.cry();
        rocketBird.fly();
        rocketBird.attack();
    }
}

二、接口

可以约束类的行为,是一些方法特征的集合,没有方法的实现

1.接口的特性

  • 接口的命名规则与类相同。如果修饰符是 public ,则该接口在整个项目中可见;如果省略修饰符,则该接口只在当前包可见。
  • 接口中可以定义常量,不能定义变量。接口中的属性都会自动用 public static final 修饰,即接口中的属性都是全局静态常量。
  • 接口中方法自动用 public  abstract 修饰,接口中所有方法都是抽象方法。
  • 接口不能实例化,接口中不能有构造方法。
  • 接口直接可以通过 extends 实现继承关系,一个接口可以继承多个接口,但是接口不能继承类
  • 接口的实现类必须实现接口的全部方法,否则必须定义为抽象类。

练习2:USB接口

public interface Usb {
    void service();
}
public class UDisk implements Usb{
    @Override
    public void service() {
        System.out.println("连接USB口,开始传输数据。");
    }
}
public class UsbFan implements Usb{
    @Override
    public void service() {
        System.out.println("连接USB口,获得电流,风扇开始转动。");
    }
}
public class Test {
    public static void main(String[] args) {
        Usb uDisk = new UDisk();
        uDisk.service();
        Usb usbFan = new UsbFan();
        usbFan.service();
    }
}

2.接口表示一种能力

体现在接口的方法上,一个类实现了某个接口,就表示这个类具备了某种能力

3.接口表示一种约定

有些接口只有名称

4.面向接口编程

面向接口编程就是先把客户的业务逻辑线提取出来,作为接口,业务具体实现通过该接口的实现类来完成。当客户需求变化时,只需编写该业务逻辑的新的实现类,替换该接口的实现类就可以完成需求,不需要改写现有代码,减少对系统的影响。

优点

  • 接口体现了约定和实现相分离的原则
  • 面向接口编程就意味着:开发系统时,主题架构使用接口,接口构成系统的骨架,这样就可以通过更换实现接口的类来实现更换需求。

三、抽象类和接口的联系和区别

相同点:

  1. 代表系统的抽象层
  2. 都不能被实例化
  3. 都能包含抽象方法:用于描述系统提供的服务,不必提供具体实现

不同点:

  1. 在抽象类中可以为部分方法提供默认实现,而接口只能包含抽象方法
  2. 抽象类便于复用,接口便于代码维护
  3. 一个类只能继承一个直接的父类,但可以实现多个接口

  • 11
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值