浅谈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日

相关文章

  • struts2中通过json传值解决乱码问题的实现方法

    下面我将详细讲解一下在Struts2中如何通过JSON传值解决乱码问题的具体实现方法。 1. 出现乱码问题的原因 在Struts2使用JSON传值时出现乱码的原因,主要是因为在服务器端和客户端之间传输的中间环节中,出现了编码格式不一致的情况,导致数据在传输过程中出错。 2. 解决乱码问题的实现方法 2.1 设置JSON编码器的字符集 首先,我们需要在Stru…

    Java 2023年5月20日
    00
  • JS自定义对象实现Java中Map对象功能的方法

    实现Java中Map对象的功能是通过JavaScript自定义对象来实现的。在JavaScript中,每个对象都可以包含一些属性和方法来定义其特定的行为。我们可以使用这一特性来模拟Java中的Map对象。 定义一个自定义对象 Map 对象是一个键值对的集合,我们可以用一个自定义的对象来代表这个集合。定义一个 Map 对象的例子如下: function Map…

    Java 2023年5月26日
    00
  • 微信支付jsapi缺少参数 total_fee 错误分析与解决方法

    下面我就对“微信支付jsapi缺少参数 total_fee 错误分析与解决方法”这个问题进行详细讲解,包括错误原因分析和解决方法。 问题分析 首先,我们需要了解这个错误的含义。这个错误提示是指在调用微信支付 jsapi 时出现了缺少参数 total_fee 的情况。total_fee 参数指订单总金额,如果没有正确传递该参数,那么就会出现这个错误。 下面,我…

    Java 2023年5月23日
    00
  • 详解springmvc之json数据交互controller方法返回值为简单类型

    下面是详解springmvc之json数据交互controller方法返回值为简单类型的攻略。 什么是Spring MVC? Spring MVC是一个基于Java的Web框架,用于开发Web应用程序。它使用Java Servlet API和为其定义的JavaServer Pages(JSP)规范来实现Web组件。 什么是JSON? JSON(JavaScr…

    Java 2023年5月26日
    00
  • Spring boot异步任务原理全面分析

    Spring Boot异步任务原理全面分析 Spring Boot提供了异步任务的支持,可以让我们在处理一些耗时的操作时,不会阻塞主线程,提高应用程序的性能和响应速度。本文将介绍Spring Boot异步任务的原理和使用方法,并提供两个示例,演示如何使用Spring Boot异步任务。 1. 异步任务原理 Spring Boot异步任务的实现原理是基于Jav…

    Java 2023年5月14日
    00
  • Spring Boot 底层原理基础深度解析

    Spring Boot 底层原理基础深度解析 Spring Boot 是一款基于 Spring 框架的开发框架,它的出现极大地提高了开发效率。本篇文章将从底层原理入手,对 Spring Boot 的实现机制进行深度解析。 Spring Boot 的核心概念 Spring Boot 的核心概念包括自动装配、起步依赖和 SpringApplication。其中,…

    Java 2023年5月15日
    00
  • Junit启动测试mybatis xml文件BindingException: Invalid bound statement问题

    背景:1、正常启动,xml文件放在java目录和resource目录下均正常    2、junit启动,xml文件放在resource目录下正常,放在java目录下报BindingException错误 mapperlocation绑定地址为:”classpath:com/a/b/**/*.xml”   原因就在于绑定的地址有问题。   junit生成的te…

    Java 2023年4月22日
    00
  • 使用Spring Boot Maven插件的详细方法

    使用Spring Boot Maven插件可以方便地将Spring Boot应用程序打包成可执行JAR文件,并且无需手工安装和配置相关的依赖项。下面是使用Spring Boot Maven插件的详细方法: 步骤一:添加Spring Boot Maven插件 首先,在项目的pom.xml文件中,添加如下代码块,来引入Spring Boot Maven插件: &…

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