JAVA中关于抽象类和接口的知识点

本文深入探讨了抽象类和接口的概念,包括它们的定义、特点、语法和在Java中的使用方式。通过具体示例,解释了如何利用抽象类和接口进行面向抽象编程,以降低程序耦合度并提高扩展性。

抽象类的概念

首先明确,类是现实生活中不存在的,是人类大脑思考总结的结果。而抽象类是类与类之间的共同特征,将这些具有共同特征的类再进一步抽象就形成了抽象类

抽象类的语法

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

抽象类的特点

  • 抽象类属于引用数据类型
  • 抽象类无法被实例化,无法创建对象,是专门用来被子类继承的一种类
  • 抽象类的子类还可以是抽象类
  • 抽象类有构造方法,构造方法是供子类使用的
  • 抽象类关联到一个概念:抽象方法,即没有实现的方法,有abstract修饰的没有方法体的方法
  • 抽象类中不一定有抽象方法,但抽象方法必须出现在抽象类中

抽象方法的语法

[修饰符列表]  abstract 返回值类型 类名(参数列表);

接口的概念

我们知道知道java中只支持单继承,但如果我们想定义一些功能,想让一个子类都继承实现,显然没办法做到,所有Java提供了接口这个概念,这样我们就可以用一个子类去实现多个接口。我们可以理解为接口就是特殊的抽象类

接口的语法

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

}

 

接口的特点

  • 接口是一种引用数据类型
  • 接口是完全抽象的。(抽象类是半抽象)或者也可以说接口时特殊的抽象类
  • 接口支持多继承,一个接口可以继承多个接口,类也可以同时实现多个接口
  • 接口中只包含两部分内容,一部分是常量(public static final 可以省略),另一部分是抽象方法(接口中的方法不能有方法体)
  • 接口中所有的元素都是public修饰的,方法都是public abstract修饰的
  • 继承接口,又称为接口的实现,继承接口必须使用implements关键字,而且必须实现接口内所有的方法
  • 接口可以与多态联合使用,即接口类型引用指向子类对象
  • 经过测试,接口和接口之间在进行强制类型转换的时候,没有继承关系,也可以强转,编译器不报错,但是运行时会报异常

如果继承和接口共存该怎样写??

extends关键字在前,implement关键字在后,否则报错

 

接口在开发中的作用

1.类似于多态的作用

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

举个例子:

中午去饭店吃饭,这个过程中就体现了接口的作用

首先,菜单可以作为一个接口(菜单上有一个抽象的照片:西红柿炒鸡蛋)

顾客面向菜单点菜,调用接口

后台厨师负责把西红柿鸡蛋做好,是接口的实现者

这个接口有什么作用呢?

这个饭馆的“菜单”,让“顾客”和“后厨”解耦合了,顾客不用找后厨,后厨不用找顾客,他们之间完全依靠这个抽象的菜单沟通。

代码如下:

菜单接口

public interface FoodMenu {
    //西红柿炒鸡蛋
    void shiZiChaoJiDan();
}

中国厨师类

public class ChineseCook implements FoodMenu{
    public void shiZiChaoJiDan(){
        System.out.println("中国厨师炒鸡蛋");
    }
}

外国厨师类

public class ForeignCook implements FoodMenu{
    
    public void shiZiChaoJiDan() {
        System.out.println("外国厨师在炒鸡蛋");
    }
}

顾客类

class  Customer{
    /*
       顾客里有一个菜单,是一个has a关系,has a 关系统一以属性方式存在
        */
    private FoodMenu foodMenu;
    /*
    如果这样写,就表示写死了
    ChineseCook cc;
    ForeignCook fc;
     */
    public Customer() {

    }
    public Customer(FoodMenu foodMenu) {
        this.foodMenu = foodMenu;
    }

    public FoodMenu getFoodMenu() {
        return foodMenu;
    }

    public void setFoodMenu(FoodMenu foodMenu) {
        this.foodMenu = foodMenu;
    }

    void order(){
        foodMenu.shiZiChaoJiDan();
    }
}

测试

public class Test {
    public static void main(String[] args) {
        //创建厨师对象
        FoodMenu cook1 = new ChineseCook();
        //创建顾客对象
        Customer c = new Customer();
        //顾客点菜
        c.setFoodMenu(cook1);
        c.order();
    }
}

输出结果

总结一句话:

面向 接口编程,可以降低程序的耦合度,提高程序的扩展里,复合OCP开发原则,接口的使用离不开多态机制。

接口可以将调用者和实现者解耦合。

 

类型和类型之间的关系

is a:

凡是满足is a的表示“继承关系”

has a:

凡是满足has a关系的表示“关联关系”

关联关系通常以“属性”的形式存在

like a:

例如厨师像一个菜单

凡士能够满足like a关系的表示“实现关系”

实现关系通常是“类实现关系”

 

抽象类和接口的区别

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

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值