JavaSE进阶 第二章 抽象类及接口

1.抽象类

1.1抽象类总结

  1. 抽象类的定义
[修饰符列表] abstract class 类名{
	类体;
}
  1. 抽象类是无法被实例化的(创建对象),抽象类是引用数据类型,用来被子类继承的
  2. 抽象类虽然无法实例化,但是有构造方法,这个构造方法是供子类使用的
  3. final修饰的类是无法被继承的,与abstract是对立的,两者无法联合使用
  4. 抽象类的子类可以滴抽象类,也可以是非抽象类
  5. 抽象类中不一定有抽象方法,抽象方法只能出现在抽象类中
  6. 一个非抽象类,继承抽象类,必须将抽象类中的抽象方法进行覆盖/重写/实现

判断题:Java语言中凡是没有方法体的方法都是抽象方法。
错误,反例:Object类的public native inthashCode();
该方法底层抵用C++写的动态链接库程序。修饰符列表中没有abstract,native表示调用JVM本地程序
示意图:
在这里插入图片描述

1.2抽象方法

抽象方法的定义

public abstract void doSome();

抽象方法表示没有实现的方法,特点:

  1. 没有方法体,以分号结尾
  2. 前面的修饰符列表中有abstract关键字

1.3抽象编程

Animal a = new Bird();
a.move();

Animal为抽象类,利用多态,面向抽象编程,不要面向具体编程,降低程序的耦合度,提高程序的扩展力。符合OCP原则

2.接口

2.1接口的基础语法

  1. 接口是一种“引用数据类型”
  2. 接口是完全抽象的,抽象类是半抽象的,或则说接口是特殊的抽象类
  3. 接口的定义
[修饰符列表] interface 接口名{
   常量;
   抽象方法;
}
  1. 接口支持多继承
  2. 接口只包含两部分:常量 、抽象方法
  3. 接口中所有的元素都是public修饰的
  4. 接口中的方法都是抽象方法,没有方法体,定义时 public abstract 可以省略
  5. 接口中常量的 public static final 可以省略
  6. 一个非抽象的类实现接口的时候,必须将接口中的所有方法加以实现
  7. 一个类可以实现多个接口
  8. extends和implements 可以共存,extends在前,implements在后
class Cat extends Animal implements Flyable{ }
  1. 使用接口写代码时,可以使用多态

2.2接口在开发中的作用

接口在开发中的作用类似多态在开发中的作用,接口的使用离不开多态机制
接口+多态才能达到降低耦合度:接口无法直接创建对象,需要向上转型 FoodMenu cc = new ChineseCook();
接口可以将调用者和实现者解耦合:调用者面向接口调用,实现者面向接口编写实现
大项目开发中,一般将项目分离为一个模块一个模块。模块间采用接口衔接,降低耦合度
编写接口由经验丰富的开发人员完成:架构师、项目经理、高级软件工程师、系统分析师…

3.类与类之间的关系

  1. is a: Cat is an Animal 凡是满足is a 的表示继承
A extends B
  1. has a:I has a Pen 凡是满足has a 关系的表示“关联关系”,通常以“属性”的形式存在
A{
   B b;
}
  1. like a :Cook like a FoodMenu 凡是能够满足like a 关系的表示“实现关系”,通常为:类实现接口
A implements B

4.抽象类与接口的区别

  • 抽象类是半抽象的,接口是完全抽象的
  • 抽象类中有构造方法,接口中没有构造方法
  • 类与类之间只能单继承,接口之间支持多继承
  • 一个类只能继承一个类,可以同时实现多个接口
  • 接口中只允许出现常量和抽象方法

以后接口使用的比抽象类多,接口一般是对行为的抽象

5.示例

public interface FoodMenu {
    //炒鸡蛋
    void chaoJIDan();
    //红烧肉
    void hongShaoRou();
}
public class AmericanCook implements FoodMenu {
    @Override
    public void chaoJIDan() {
        System.out.println("美国厨师炒鸡蛋");
    }
    @Override
    public void hongShaoRou() {
        System.out.println("美国师傅烧红烧肉");
    }
}
public class ChineseCook implements FoodMenu {
    @Override
    public void chaoJIDan() {
        System.out.println("中餐师傅炒鸡蛋");
    }
    @Override
    public void hongShaoRou() {
        System.out.println("中餐师傅烧红烧肉");
    }
}
public class Customer {
    private FoodMenu foodMenu;
    public Customer(){
    }
    public Customer(FoodMenu foodMenu) {
        this.foodMenu = foodMenu;
    }
    public FoodMenu getFoodMenu() {
        return foodMenu;
    }
    public void setFoodMenu(FoodMenu foodMenu) {
        this.foodMenu = foodMenu;
    }
    public void order(){
      // FoodMenu foodMenu = this.getFoodMenu()
        foodMenu.chaoJIDan();
        foodMenu.hongShaoRou();
    }
}
public class Test {
    public static void main(String[] args) {
        FoodMenu cooke1 = new ChineseCook();
        Customer customer = new Customer(cooke1);
        customer.order();
    }
}

传送门

上一章:JavaSE进阶 第一章 final关键字
下一章:JavaSE进阶 第三章 包、import和访问权限

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值