【JavaSE专栏64】抽象类和接口,不能被实例化的类有什么用?

简介: 【JavaSE专栏64】抽象类和接口,不能被实例化的类有什么用?

本文讲解了 Java 中抽象类和接口概念及语法,并给出了样例代码。抽象方法是只有声明而没有实现的方法,需要子类来实现,接口是一种抽象的类型,它定义了一组方法的签名,但没有实现这些方法的具体实现代码。


一、什么是抽象类

在 Java 中,抽象类是指不能被实例化的类,它只能被用作其他类的基类。

抽象类通过关键字 abstract 来声明,包含抽象方法和非抽象方法,抽象方法是只有声明而没有实现的方法,需要子类来实现,非抽象方法是有具体实现的方法,子类可以直接继承和使用。

抽象类有以下 4 44 个特点,请同学们认真学习。

  1. 抽象类不能被实例化:抽象类不能直接创建对象,只能作为父类被继承。
  2. 子类必须实现抽象方法:如果一个类继承了一个抽象类,那么它必须实现抽象类中的所有抽象方法,除非该子类也是一个抽象类。
  3. 子类可以继承非抽象方法:抽象类中可以包含非抽象方法,子类可以直接继承和使用这些非抽象方法。
  4. 抽象类可以包含成员变量和构造方法:抽象类可以定义成员变量和构造方法,供子类继承和使用。

抽象类的主要作用是为了实现代码的复用性和扩展性,通过定义抽象类,可以将一些共同的属性和方法抽象出来,让子类来继承和实现具体的业务逻辑,抽象类还可以用于定义一些共同的接口和约束,提高代码规范性和可维护性。

下面是一个示例代码来说明抽象类的使用,请同学们复制到终端执行。

// 抽象类
abstract class Animal {
   // 抽象方法
   public abstract void sound();
   // 非抽象方法
   public void sleep() {
      System.out.println("Animal is sleeping.");
   }
}
// 子类
class Dog extends Animal {
   // 实现抽象方法
   public void sound() {
      System.out.println("Dog is barking.");
   }
}
// 子类
class Cat extends Animal {
   // 实现抽象方法
   public void sound() {
      System.out.println("Cat is meowing.");
   }
}
public class Main {
   public static void main(String[] args) {
      Animal dog = new Dog();
      dog.sound(); // 输出: Dog is barking.
      dog.sleep(); // 输出: Animal is sleeping.
      Animal cat = new Cat();
      cat.sound(); // 输出: Cat is meowing.
      cat.sleep(); // 输出: Animal is sleeping.
   }
}

在上面的示例中,Animal 是一个抽象类,其中包含了抽象方法 sound() 和非抽象方法 sleep(),Dog 和 Cat 都是 Animal 的子类,它们必须实现抽象方法 sound()

通过创建Animal类型的对象引用 dogcat,并调用其相应的方法,可以看到不同子类对象的不同行为。

抽象类是一种特殊的类,不能被实例化,只能被继承,它提供了一种机制来定义类的接口和规范,实现了代码的复用性和扩展性。


二、什么是接口

在 Java 中,接口是一种抽象的类型,它定义了一组方法的签名,但没有实现这些方法的具体实现代码

接口可以被类实现,一个类实现了接口后,就必须实现接口中定义的所有方法。

下面是一个简单的示例代码,展示了一个名为Shape的接口,请同学们复制到终端执行。

// 定义一个 Shape 接口
interface Shape {
    double getArea();  // 获取形状的面积
    double getPerimeter();  // 获取形状的周长
}
// 实现 Shape 接口的圆形类
class Circle implements Shape {
    private double radius;
    public Circle(double radius) {
        this.radius = radius;
    }
    public double getArea() {
        return Math.PI * radius * radius;
    }
    public double getPerimeter() {
        return 2 * Math.PI * radius;
    }
}
// 实现 Shape 接口的矩形类
class Rectangle implements Shape {
    private double width;
    private double height;
    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }
    public double getArea() {
        return width * height;
    }
    public double getPerimeter() {
        return 2 * (width + height);
    }
}
public class Main {
    public static void main(String[] args) {
        Circle circle = new Circle(5.0);
        System.out.println("圆形的面积:" + circle.getArea());
        System.out.println("圆形的周长:" + circle.getPerimeter());
        Rectangle rectangle = new Rectangle(3.0, 4.0);
        System.out.println("矩形的面积:" + rectangle.getArea());
        System.out.println("矩形的周长:" + rectangle.getPerimeter());
    }
}

在上面的代码中,我们定义了一个名为 Shape 的接口,其中包含了获取形状面积和周长的方法。

然后我们创建了两个类 CircleRectangle,它们都实现了 Shape 接口,必须实现接口中的方法。

最后,在主函数中我们创建了一个 Circle 对象和一个 Rectangle 对象,并分别调用了它们的 getAreagetPerimeter 方法来获取面积和周长。


三、抽象类和接口的区别

在 Java 中,抽象类和接口都是用来实现类和类之间的关系,但它们有一些区别。

  1. 实现方式
  • 抽象类是一种普通的类,可以包含成员变量、构造方法、普通方法、抽象方法等,并且可以有方法的实现代码。
  • 接口是一种特殊的类,只能包含常量和抽象方法,不能有成员变量和方法的实现代码。
  1. 继承关系
  • 一个类只能继承一个抽象类,通过使用关键字 extends 来实现继承。
  • 一个类可以实现多个接口,通过使用关键字 implements 来实现接口。
  1. 方法定义
  • 抽象类中的抽象方法可以有方法体,也可以有普通方法的实现代码。
  • 接口中的方法都是抽象方法,没有方法体,只有方法的签名。
  1. 用途
  • 抽象类用于表示一种通用的概念,可以包含通用的属性和方法,同时也可以定义一些抽象方法,由子类去实现。
  • 接口用于定义一组操作,表示一种行为的能力,通过实现接口来表示类具有某种行为的能力。

总之,抽象类和接口都是用于实现类和类之间的关系,抽象类更适合用于定义通用的属性和方法,而接口更适合用于定义行为的能力,在使用时,应根据具体的需求和设计目标选择合适的抽象类或接口。


四、抽象类和接口的面试题

  1. 抽象类和接口的区别是什么?它们何时使用?
  2. 一个类可以同时继承抽象类和实现接口吗?为什么?
  3. 抽象类是否可以没有抽象方法?接口是否可以没有方法?
  4. 抽象类和接口的成员变量有什么区别?
  5. 接口可以继承接口吗?抽象类可以继承抽象类吗?
  6. 在接口中,可以定义静态方法吗?在抽象类中呢?
  7. 抽象类和接口在多态性方面有何不同?
  8. 为什么 Java 中不支持多继承?接口是如何解决这个问题的?
  9. 在 Java 8 中,接口添加了哪些新特性?
  10. 什么情况下应该使用抽象类,什么情况下应该使用接口?


五、总结

本文讲解了 Java 中抽象类和接口的概念及语法,并给出了样例代码,在下一篇博客中,将讲解 Java 内部类的知识点。


相关文章
【零基础学Java】—继承父类并实现多个接口(二十五)
【零基础学Java】—继承父类并实现多个接口(二十五)
|
6月前
|
Java
JavaSE——面向对象高级二(4/4)-接口的其他细节-三个新方法(默认方法、私有方法、静态方法),接口的多继承
JavaSE——面向对象高级二(4/4)-接口的其他细节-三个新方法(默认方法、私有方法、静态方法),接口的多继承
42 0
|
7月前
|
Java API 数据库
大厂面试题详解:抽象类可以被实例化吗
字节跳动大厂面试题详解:抽象类可以被实例化吗
82 0
|
7月前
|
Java
JavaSE碎碎念:抽象类继承被子类继承之后方法调用关系
JavaSE碎碎念:抽象类继承被子类继承之后方法调用关系
|
7月前
|
存储 Java 编译器
JavaSE学习之--抽象类,接口,内部类(三)
JavaSE学习之--抽象类,接口,内部类(三)
41 0
|
7月前
|
存储 Java 机器人
JavaSE学习之--抽象类,接口,内部类(二)
JavaSE学习之--抽象类,接口,内部类(二)
57 0
|
7月前
|
Java
JavaSE学习之--抽象类,接口,内部类(一)
JavaSE学习之--抽象类,接口,内部类(一)
93 0
|
Java 编译器
JavaSE抽象类和接口
JavaSE抽象类和接口
【JavaSE专栏65】内部类的使用,定义在其他类内部的类
【JavaSE专栏65】内部类的使用,定义在其他类内部的类
JavaSE/抽象类与接口
JavaSE/抽象类与接口
下一篇
DataWorks