浅谈Java抽象类和接口的个人理解

浅谈Java抽象类和接口的个人理解

Java是一门面向对象编程语言,面向对象编程的三大特性是封装、继承和多态。抽象类和接口都是Java中体现多态的机制。

抽象类

抽象类是不能被实例化的类,它通常被用于抽象出多个类中的共性并定义出它们的方法名、参数列表、返回类型和访问类型,由其子类来实现这些方法。

抽象类的定义方式为:

public abstract class AbstractClass {
    //抽象方法,不包含具体实现
    public abstract void abstractMethod();

    //普通方法,包含具体实现
    public void nonAbstractMethod() {
        System.out.println("This is a non-abstract method");
    }
}

抽象类可以包含抽象方法和非抽象方法,抽象方法没有实际的方法体,而非抽象方法则有方法体,可以被子类直接继承或重写。

当一个子类继承抽象类时,必须实现它继承的所有抽象方法,否则这个子类也必须被声明为抽象类。

public class SubClass extends AbstractClass {
    @Override
    public void abstractMethod() {
        System.out.println("This is an implementation of abstractMethod in SubClass");
    }
}

public class AnotherSubClass extends AbstractClass {
    @Override
    public void abstractMethod() {
        System.out.println("This is just another implementation of abstractMethod in AnotherSubClass");
    }
}

接口

接口是一种特殊的抽象类,它只包含了抽象方法和常量的定义,在接口中所有的方法都是抽象方法,没有被实现的方法体。

接口的定义方式为:

public interface Interface {
    //抽象方法,不包含具体实现
    void abstractMethod();

    //默认方法,提供具体实现
    default void defaultMethod() {
        System.out.println("This is a default method in Interface");
    }
}

接口中的方法默认是public和abstract的,可以省略这两个关键字。接口还可以定义默认方法和静态方法。默认方法必须有方法体,静态方法只能通过接口名称来调用,不能通过实现该接口的对象来调用。

一个类可以实现多个接口,实现接口时需要实现接口中所有的抽象方法。

public class ClassImpl implements Interface1, Interface2 {
    @Override
    public void abstractMethod() {
        System.out.println("This is an implementation of abstractMethod in ClassImpl");
    }

    @Override
    public void defaultMethod() {
        System.out.println("This is a special implementation of defaultMethod in ClassImpl");
    }
}

public interface Interface1 {
    void abstractMethod();
}

public interface Interface2 {
    void abstractMethod();
    void defaultMethod();
}

抽象类和接口的选择

  1. 抽象类往往更适合于一些相对比较复杂、变化不确定的场景,抽象类可以定义一些共性的方法和属性,使得其子类可以很容易地继承和扩展,同时不必反复编写这部分代码。
  2. 接口则更适合于一些稳定、简单、无需扩展的场景,接口中只提供对外公开的方法的定义,可以保证实现该接口的类都有相同的方法和参数。一个类实现多个接口可以达到复合多种接口的目的。

示例一:抽象类

假设有一个动物类Animal,其中有一些通用的属性和方法,如颜色、体重、eat()方法等,这些是可以放在一个父类里面实现,并对其进行抽象化,用于多个子类继承。猪类Pig、狗类Dog、猫类Cat都可以继承父类Animal,实现自身的属性和方法。

public abstract class Animal {
    private String color;
    private double weight;

    public abstract void eat();
}

public class Pig extends Animal {
    @Override
    public void eat() {
        System.out.println("Pig eat corn");
    }
}

public class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("Dog eat meat");
    }
}

public class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("Cat eat fish");
    }
}

示例二:接口

假设我们要实现一个图形类Shape,其中有一个求面积的方法getArea()和一个求周长的方法getPerimeter(),但我们并不知道实现这个图形类的子类会有哪些,因此我们可以使用接口来进行定义。正方形类Square、圆形类Circle、矩形类Rectangle都可以实现该接口,并且根据图形的特性分别实现自己的getArea()和getPerimeter()。

public interface Shape {
    double getArea();
    double getPerimeter();
}

public class Square implements Shape {
    private double length;

    public Square(double length) {
        this.length = length;
    }

    @Override
    public double getArea() {
        return length * length;
    }

    @Override
    public double getPerimeter() {
        return length * 4;
    }
}

public class Circle implements Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    public double getArea() {
        return Math.PI * radius * radius;
    }

    @Override
    public double getPerimeter() {
        return 2 * Math.PI * radius;
    }
}

public class Rectangle implements Shape {
    private double length;
    private double width;

    public Rectangle(double length, double width) {
        this.length = length;
        this.width = width;
    }

    @Override
    public double getArea() {
        return length * width;
    }

    @Override
    public double getPerimeter() {
        return 2 * (length + width);
    }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈Java抽象类和接口的个人理解 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • MyBatis-plus+达梦数据库实现自动生成代码的示例

    接下来我将详细讲解如何使用MyBatis-plus和达梦数据库实现自动生成代码的步骤和注意事项。 环境准备 JDK 1.8及以上版本 Maven 3.5及以上版本 Spring Boot 2.x及以上版本 MyBatis-plus 3.x及以上版本 达梦数据库 JDBC 驱动程序 步骤一:添加依赖 首先,在使用 MyBatis-plus 时,需要添加相应的依…

    Java 2023年5月20日
    00
  • Java的Struts框架报错“ActionServletException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“ActionServletException”错误。这个错误通常由以下原因之一起: 配置错误:如果配置文件中存在错误,则可能会出现此。在这种情况下,需要检查配置文件以解决此问题。 类加载错误:如果类加载失败,则可能会出现此。在这种情况下,需要检查类路径以解决此问题。 以下是两个实例: 例 1 如果配置文件中存在…

    Java 2023年5月5日
    00
  • JavaFX实现简易时钟效果(二)

    下面是详细的攻略: 1. 引言 本文将讲解如何使用JavaFX实现一个简易的时钟效果。主要涵盖以下几个方面的内容: JavaFX的基础知识及使用方法 JavaFX中时间相关的API 通过JavaFX实现时钟效果的思路和具体实现方法 2. 实现思路 我们需要实现一个数字时钟的效果,需要使用到JavaFX提供的数字、文本和时钟控件。实现思路如下: 创建一个Jav…

    Java 2023年5月20日
    00
  • Spring MVC 4.1.3 + MyBatis零基础搭建Web开发框架(注解模式)

    下面是Spring MVC 4.1.3 + MyBatis零基础搭建Web开发框架(注解模式)的完整攻略。 1. 环境搭建 JDK安装及环境变量配置 Maven安装及配置 Eclipse/IDEA集成Maven插件及配置 2. 项目建立 利用Maven建立项目:新建Maven项目,设置GroupId、ArtifactId、Version等基本信息。 导入相关…

    Java 2023年5月31日
    00
  • Java编程实现计算两个日期的月份差实例代码

    请您耐心阅读以下内容。 1. 题目分析 我们需要通过Java代码来计算两个日期之间的月份差。假设我们已经有了两个日期,如何计算它们之间的月份差? 2. 实现思路 首先,我们需要分别获取这两个日期的年份和月份,然后计算它们之间的月份差。具体步骤如下: 使用java.util.Calendar类获取日期的年份和月份。 通过计算两个日期之间的年份差和月份差,计算它…

    Java 2023年5月20日
    00
  • JSP开发中Apache-HTTPClient 用户验证的实例详解

    下面是详细的“JSP开发中Apache-HTTPClient用户验证的实例详解”的攻略: 什么是Apache-HttpClient? Apache-HttpClient是一个基于Java的Http客户端库。它提供了通过Http协议访问Web资源的方式,同时支持访问Https资源。 用户验证的作用 通过用户验证,我们可以将访问Web资源的操作限制在特定用户范围…

    Java 2023年6月15日
    00
  • Spring boot security权限管理集成cas单点登录功能的实现

    关于“Spring Boot Security权限管理集成CAS单点登录功能的实现”的攻略,我从以下几个方面来讲解: 环境搭建 CAS Server的配置和部署 Spring Boot的集成与配置 认证和授权的实现 案例演示 环境搭建 这一步骤需要我们准备好以下的工具和环境: JDK 1.8 或以上版本 Maven 3.x CAS Server 5.x Sp…

    Java 2023年6月3日
    00
  • 一套前后台全部开源的H5商城送给大家

    博主给大家推荐一套全部开源的H5电商项目waynboot-mall。由博主在2020年开发至今,已有三年之久。那时候网上很多的H5商城项目都是半开源版本,要么没有H5前端代码,要么需要加群咨询,属实恶心。于是博主决定自己开发一套完整的移动端H5商城,包含一个管理后台、一个前台H5商城、一套后端接口。项目地址如下: H5商城前端代码:https://githu…

    Java 2023年5月6日
    00
合作推广
合作推广
分享本页
返回顶部