您的位置 首页 java

什么时候在 Java 中使用接口和抽象类?

抽象类 Java 中的一个特殊类,它不能被实例化,所以不能直接使用。起初抽象的概念,抽象类和接口对很多开发者来说都是无用的,因为你不能在接口中实现任何方法,你不能创建抽象类的对象,所以你为什么需要它们。一旦他们面对软件开发的最大常数,是的,那就是变化,他们就会明白顶层的抽象如何有助于编写灵活的软件。编写软件(Java 程序、C++ 程序)时的一个关键挑战不仅是要满足当今的需求,还要确保可以处理培养需求,而无需对代码进行任何架构或设计更改。简而言之,您的软件必须足够灵活以支持未来的变化。

抽象类和继承共同确保大多数代码是使用抽象类和更高级别的类编写的,因此它可以利用继承和多态来支持未来的变化。

这实际上是最有用的设计原则之一,也称为“为接口而不是实现编程”。抽象类和抽象方法是 Java 帮助您在一定抽象级别进行编码的两种方式。

我们将在文章的后半部分介绍抽象类的语法级别细节、能力和限制,但您必须了解为什么抽象类很重要. 更重要的是,为什么您作为 Java 程序员 必须了解抽象类的动机和用途。

根据我多年的经验,我可以说首先将一个类作为接口或抽象类是一种很好的做法,它不仅可以通过提供模拟对象帮助您快速测试代码,还可以帮助您在一定程度的抽象。

在本文中,我们将通过编写一个简单的示例来了解为什么需要抽象类和抽象方法,并学习如何使用它们。

你在哪里使用 Java 中的抽象类

除了常规使用抽象类来编写灵活的代码外,抽象类还有几个巧妙的用法,确保遵循某些最佳实践。大多数这些用法都利用了抽象类的重要属性,例如您不能创建抽象类的对象。如果这样做,编译器将标记错误。

我见过的抽象类的巧妙用途之一是将抽象类与 工厂方法模式 结合使用,以确保您的客户端始终使用工厂方法来创建对象实例,而不是意外调用 构造函数 。通过使 Product 类抽象,编译器将跟踪对 new Product()的任何调用 并强制它们使用工厂方法,如 makeProduct() 或 getProduct()。

这种技术的最佳示例之一是 JDK 中的 EnumSet 类,与Set接口的其他实现不同,EnumSet 是抽象的,这确保您始终使用像 Enum Set.of()这样的工厂方法, 而不是执行 new EnumSet()。

想象一下,如果 EnumSet 不是抽象的并且您是第一次使用它,您将如何创建 EnumSet 的实例?工厂方法还是构造函数?永远记住,编译器是你最好的朋友,它会为你发现错误,所以要充分利用你最好的朋友。最佳实践可能会被遗忘,但编译器强制执行的规则永远不会。

为什么抽象类在 Java 中很重要

尽管抽象类和接口之间有很多 区别 ,但要记住的关键是它们都提供了抽象。举个例子,您需要设计一个程序,该程序可以为员工生成报告,例如他们工作了多少小时以及他们每个月的薪水多少。假设您的组织目前只有固定员工,按月支付。

你知道这一点,并以此为基础编写代码,过了一段时间,你的公司开始招聘合同工,他们按小时而不是月薪支付。现在,如果您需要重写程序来支持这一点,那么您的程序不够灵活。

另一方面,如果您只需要编写一些代码将这种新型员工插入系统,那么您的程序非常灵活且可维护。如果您知道 abstract class ,您就会将Employee 设为一个抽象类,并且将像 pay()这样的方法 抽象化,因为这在不同类型的员工之间是不同的。

现在引入一种新类型的 Employee 将是小菜一碟,您需要做的就是创建另一个 Employee 子类来表示 ContractEmployee,并且他们的薪水方法根据他们工作的小时数乘以他们的小时工资来返回薪水。所以,你的想法是对的,我们在一定的抽象级别上编码,这使我们能够适应系统中的新变化。

Java中的抽象类和方法示例

让我们看另一个 抽象类和方法的例子 ,这是一个很好的例子。我喜欢水果,它们很好吃,提供维生素,而且你不需要煮它们就可以吃。你所做的一切,你拿水果,洗干净,然后在吃之前切开它们或剥皮。我们的例子就是基于这种行为。我们创建了一个抽象类Fruit,它包含一些具体的行为,比如颜色,无论它是否是季节性水果,以及称为prepare()的抽象行为。

为了提供水果,我们需要将它们准备好食用,包括将它们切成片或剥皮。我们有两个 Fruit 类的具体实现, Mango 和 Banana,我选择这两个是因为首先,它们是我的最爱,其次它们有不同的准备方法。你切芒果,但你剥香蕉。

 package com.ewt360.homeworkprod.facade.basket;

import java.awt.Color;
import java.util.ArrayList;
import java.util.List;

/**
 * Java 程序来演示什么是Java中的抽象类和抽象方法,如何使用它们,何时使用它们,并附上一个实际的例子。
 */public class AbstractClassDemo{
    public  static   void  main(String args[]) {
        Fruit mango = new Mango(Color.YELLOW, true); // 芒果是时令
        Fruit banana = new Banana(Color.YELLOW, false);
        // 香蕉不是季节性
        List<Fruit> platter = new ArrayList<Fruit>();
        platter.add(mango);
        platter.add(banana);
        serve(platter);
    }

    public static void serve(List<Fruit> fruits) {
        System.out.println("准备上菜的水果");
        for (Fruit f : fruits) { f.prepare(); }
    }


}

/**
 * 代表 Fruit 的抽象类,在这里只定义 Fruit 的基本 * 属性,并使事物抽象对于不同的水果是不同的。
 */abstract class Fruit {
     private  Color color;
    private boolean seasonal;
    public Fruit(Color color,  boolean  seasonal) {
        this.color = color;
        this.seasonal = seasonal;
    }

    /**
     * 这是一个抽象方法,看它没有方法体,只有声明
     */    public abstract void prepare();

    public Color getColor() {
        return color;
    }

    public boolean isSeasonal() {
        return seasonal;
    }
}

/**
 * 扩展 Fruit 的具体类,因为 Mango IS-A Fruit,扩展 Fruit 是合理的。它具有*水果的所有特性,并定义了如何准备芒果食用。
 */class Mango  extends  Fruit {
    public Mango(Color color, boolean seasonal) {
        super(color, seasonal);
    }

    @Override
    public void prepare() {
        System.out.println("切芒果");
    }
}

/**
 * 另一个扩展 Fruit 的具体类。
 */class Banana extends Fruit {
    public Banana(Color color, boolean seasonal) {
        super(color, seasonal);
        // TODO 自动生成的构造函数存根
    }

    @Override
    public void prepare() {
        System.out.println("剥香蕉皮");
    }
}  

关于 Java 中的抽象类和方法要记住的事情

抽象类的应用是创造性的工作,需要时间来掌握,但是记住语法和重要的属性是相当容易的,这最终会帮助你达到第一个目标。作为一名 Java 程序员,您必须始终记住以下有关抽象类和方法的内容。

1) 不能在 Java 中创建抽象类的实例。例如,如果类ABC是抽象的,那么像Abc instance = new ABC()这样的代码将导致编译时错误。想一想您可以利用此属性的两种情况,请始终记住武器可用于攻击和防御。我已经在这里讨论过的一种情况是确保您的客户端始终使用工厂方法来创建对象,而不是直接调用 构造函数

2)通过扩展抽象类来创建具体类,必须重写所有抽象方法。例如,如果类ABC具有抽象方法abc(),则扩展 ABC的类EFG必须覆盖abc()以成为具体类,即可以创建其实例。

在相关说明中,在覆盖 Java 中的方法时始终使用 @Override 注释。 它不仅可以帮助您的程序员同事了解您的意图,还可以帮助您的朋友编译器发现由于盲目相信您的其他朋友 IDE 的内容辅助而很容易发布的细微错误。相信我,使用现代 IDE 的代码自动完成功能从不同的包中导入同名的类太容易了。

3)即使没有任何抽象方法,类也可以是抽象的。虽然,在抽象类中拥有抽象方法并不是强制性的(任何编译器规则都没有保证),但这是不可取的,因为这样做没有意义。

如果您的类没有任何抽象行为(不同类型之间变化的行为),那么它是一个具体类而不是抽象类的好候选。只有一种情况我认为可以使用没有抽象方法的抽象类是当你需要一个标记类而不是标记接口时,但坦率地说,我还没有找到一个实际的用例。尽管一开始就将一个类视为抽象类可能有助于发现某种程度的抽象。

4) 顶级类和 嵌套类 都可以在Java 中进行抽象,Java 编程语言对此没有限制。

这就是 Java 中的 Abstract 类 的全部内容。永远记住,任何抽象(例如抽象类或抽象方法)在 Java 中都是不完整的,您必须扩展抽象类并覆盖抽象方法才能使用该类。请记住,抽象对于设计灵活的系统非常重要。灵活性来自于在顶层使用接口和抽象类,并利用继承和多态性来提供不同的实现,而无需更改使用它们的代码。

文章来源:智云一二三科技

文章标题:什么时候在 Java 中使用接口和抽象类?

文章地址:https://www.zhihuclub.com/174873.shtml

关于作者: 智云科技

热门文章

网站地图