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

相关文章

  • Java读取json数据并存入数据库的操作代码

    下面是Java读取Json数据并存入数据库的操作代码的攻略,包含以下四个步骤: 构建Json数据对象 读取Json数据 解析Json数据 将数据存入数据库 下面进行详细讲解。 步骤一:构建Json数据对象 使用Java构建Json对象可以使用json库的JSONObject类来构建。首先需要导入相应的依赖: <dependency> <gr…

    Java 2023年5月20日
    00
  • mysql+spring+mybatis实现数据库读写分离的代码配置

    MySQL数据库读写分离是提高Web应用性能和可用性的重要手段之一。开发人员可以通过使用JDBC、Spring和MyBatis等技术实现MySQL数据库读写分离。 以下是实现数据库读写分离的完整攻略: 1. 安装和配置MySQL主从服务器 确保安装和配置了MySQL主从服务器,并确保主服务器和从服务器之间已正确配置了“主从同步”。可以考虑使用软件程序如MyS…

    Java 2023年6月1日
    00
  • Redis数据库中实现分布式锁的方法

    下面是详细讲解 Redis 数据库中实现分布式锁的方法的完整攻略。 什么是分布式锁? 分布式锁是指多个进程或者不同的机器在进行分布式系统协同工作时,为了避免数据同时被多个进程或机器访问而导致数据不一致或者错误的问题而采用的同步机制。 在 Redis 中实现分布式锁是非常常见和实用的场景,下面将主要阐述 Redis 实现分布式锁的方法。 实现 Redis 分布…

    Java 2023年5月19日
    00
  • Java Process.waitFor()方法详解

    Java Process.waitFor()方法详解 Java中的Process类提供了在Java程序中启动外部进程的能力。在执行外部进程时,可能需要等待该进程完成,waitFor()方法就提供了这个功能。 Process.waitFor()方法概述 waitFor()方法是Process类的实例方法,用于等待进程完成。它会阻塞当前线程,直到关联的进程终止。…

    Java 2023年5月27日
    00
  • 详解Java中native方法的使用

    详解Java中native方法的使用 什么是native方法 在Java中,native方法是指使用C、C++等非Java语言实现的方法,通常用于Java程序中需要与底层操作系统或硬件等交互的场景,比如操作系统中调用一些API,访问硬件等。 使用native方法 在Java中使用native方法需要以下步骤: 声明native方法,以告诉编译器该方法的实现不…

    Java 2023年5月26日
    00
  • Java8之Lambda表达式使用解读

    Java8之Lambda表达式使用解读 什么是Lambda表达式? Lambda表达式是一种匿名函数,它没有名称,但它有参数列表、函数体和可能存在的返回类型,可以在需要函数类型的上下文中使用。 举个例子,我们可以使用Lambda表达式来实现简化的Runnable接口: Runnable r = () -> System.out.println(&quo…

    Java 2023年5月26日
    00
  • Netty粘包拆包及使用原理详解

    Netty粘包拆包及使用原理详解 在使用Netty进行网络编程时,可能会遇到粘包或拆包的问题,本文将详细讲解Netty粘包拆包的原因和解决方案,并提供两个示例帮助理解。 什么是粘包和拆包 在网络通信中,发送端将多个小的数据包合并成一个大的数据包发送给接收端,称为粘包;接收端在接收数据时,将一个大的数据包拆分成多个小的数据包,称为拆包。由于网络传输是面向字节流…

    Java 2023年5月20日
    00
  • Struts 2 实现Action的几种方式

    Struts 2 实现 Action 的几种方式包括以下几种:基于方法、基于类、基于接口、基于注解,以及自定义 Action。 基于方法 这种方式是在 Action 类中定义不同的方法来处理不同的请求,例如: public class UserAction{ public String list(){ // 处理列表请求 return "list&…

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