Java 抽象类与接口

发布于 2024-08-24 06:19:39 字数 2678 浏览 10 评论 0

抽象类

在面向对象的领域 一切都是对象,所有的对象都是通过 来描述的。抽象类是指类中没有足够的信息描述对象,需要别的类扩展。抽象类需要在类定义的前面增加 abstract 关键字。

abstract class Graph {
    String name;
    public Graph(){}
    public Graph(String name) {
        this.name = name;
    }
    public void show() {
        System.out.println("I'm a graph");
    }
}

abstract 关键字同样可以用来声明抽象方法,抽象方法只包含方法名,而没有方法体。抽象方法没有定义,方法名后面直接跟一个分号,而不是花括号。声明抽象方法会带来以下两个结果:

  • 如果一个类包含抽象方法,那么该类必须是抽象类。
  • 任何子类必须重写父类的抽象方法,否则就必须声明自身为抽象类。

一般情况下,我们将一个类声明为 abstract 的,是因为它包含了 没有具体实现的抽象方法。比如说我们给 Graph 类增加一个求面积的方法 area(),因为我们不知道图形的形状,我们是无法给出实现的,只能交给特定的子类去实现,这时我们只能将 area() 声明为 abstract 的,代码如下

abstract class Graph {
    String name;
    public Graph(){}
    public Graph(String name) {
        this.name = name;
    }
    public void show() {
        System.out.println("I'm a graph");
    }
    public abstract double area();
}

// 这时 Rectangle 类就必须给出 area() 方法的实现,否则它自己也必须用 abstract 修饰

class Rectangle extends Graph{
    double width;
    double height;
    public double area() {
        return width * height;
    }
}

接口

接口 Interface 是一组 抽象方法的集合。接口中定义的方法没有方法体。接口也和抽象类一样,无法被实例化,但是可以被实现( implements )。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。接口中的方法都是外部可访问的,因此我们可以不需要用 public 修饰,接口中也可以声明变量,一般是 finalstatic 类型的,要以常量来初始化,实现接口的类不能改变接口中的变量

  • 接口中的变量默认是 public, static, and final ,[参考][2],所以不需要再写 public static final VARIABLE = XXX;
interface Animal {
    static final int TIMES_OF_EATING = 3;
    void eat();
    void sleep();
}
// 接口可以继承其他的接口
interface TerrestrialAnimal extends Animal {
    void run();
}

接口实现

类使用 implements 关键字实现接口,类需要对接口中的每一个方法都给出实现。

class Cat implements Animal {
    public void eat() {
        System.out.println("eat");
    }
    public void sleep() {
        System.out.println("sleep");
    }
}

抽象类和接口的比较

相同点:

  • 都不能被实例化
  • 都包含抽象方法,用于描述系统能提供哪些服务,由子类来提供实现具体的服务
  • 在系统设计上,两者都代表系统的 抽象层,当一个系统使用一棵继承树上的类时,应该尽量把引用变量声明为继承树的上层抽象类型,这样可以提高两个系统之间的松耦合

不同点:

  • 在抽象类中可以为部分方法 提供默认的实现,从而避免在子类中重复实现它们,但是抽象类 不支持多继承。接口 不能实现任何方法。但是 支持多继承
  • 接口是定义者和实现者的一种契约,而抽象类和具体类一般而言是一种 is-a 的关系,即两者在概念本质上是不同的。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

樱娆

暂无简介

0 文章
0 评论
24 人气
更多

推荐作者

xu362930323

文章 0 评论 0

缱倦旧时光

文章 0 评论 0

qq_eXruk9

文章 0 评论 0

遂心如意

文章 0 评论 0

guojiayue1

文章 0 评论 0

愿与i

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文