Java抽象类和接口的区别详情

作者:海拥 时间:2023-05-23 20:09:59 

1、抽象类 vs 接口 

  • 方法类型: 接口只能有抽象方法。抽象类可以有抽象和非抽象方法。从 Java 8 开始,它也可以有默认和静态方法。

  • 最终变量: 在 Java 接口中声明的变量默认是最终的。抽象类可能包含非最终变量。

  • 变量类型: 抽象类可以有final、non-final、静态和非静态变量。接口只有静态和最终变量。

  • 实现: 抽象类可以提供接口的实现。接口不能提供抽象类的实现。

  • 继承 vs 抽象:  Java 接口可以使用关键字“implements”来实现,抽象类可以使用关键字“extends”进行扩展。

  • 多重实现: 一个接口只能扩展另一个Java接口,一个抽象类可以扩展另一个Java类并实现多个Java接口。

  • 数据成员的可访问性: 默认情况下,Java 接口的成员是公共的。Java 抽象类可以具有私有、受保护等类成员。


import java.io.*;

abstract class Shape {

String objectName = " ";

Shape(String name) { this.objectName = name;

}

public void moveTo(int x, int y){

System.out.println(this.objectName + " "

+ "已移至"

+ " x = " + x + " and y = " + y);

}

abstract public double area();

abstract public void draw();

}

class Rectangle extends Shape {

int length, width;

Rectangle(int length, int width, String name){

super(name);

this.length = length;

this.width = width;

}

@Override public void draw(){

System.out.println("矩形已绘制");

}

@Override public double area(){

return (double)(length * width);

}

}

class Circle extends Shape {

double pi = 3.14;

int radius;

Circle(int radius, String name){

super(name);

this.radius = radius;

}

@Override public void draw(){

System.out.println("圆形已绘制");

}

@Override public double area(){

return (double)((pi * radius * radius) / 2);

}

}

class HY {

public static void main(String[] args){

Shape rect = new Rectangle(2, 3, "Rectangle");

System.out.println("矩形面积:"

+ rect.area());

rect.moveTo(1, 2);

System.out.println(" ");

Shape circle = new Circle(2, "Circle");

System.out.println("圆的面积:"

+ circle.area());

circle.moveTo(2, 4);

}

}

输出:

矩形面积:6.0

矩形已移至 x = 1 和 y = 2

圆的面积:6.28

圆已移至 x = 2 和 y = 4

如果我们在矩形和圆形之间没有任何通用代码,请使用界面。


import java.io.*;

interface Shape {

void draw();

double area();

}

class Rectangle implements Shape {

int length, width;

Rectangle(int length, int width){

this.length = length;

this.width = width;

}

@Override public void draw(){

System.out.println("矩形已绘制");

}

@Override public double area(){

return (double)(length * width);

}

}

class Circle implements Shape {

double pi = 3.14;

int radius;

Circle(int radius) { this.radius = radius; }

@Override public void draw(){

System.out.println("圆形已绘制");

}

@Override public double area(){

return (double)((pi * radius * radius) / 2);

}

}

class HY {

public static void main(String[] args){

Shape rect = new Rectangle(2, 3);

System.out.println("矩形面积:"

+ rect.area());

Shape circle = new Circle(2);

System.out.println("圆的面积:"

+ circle.area());

}

}

输出:

矩形面积:6.0

圆的面积:6.28

什么时候用什么?

如果以下任何陈述适用于您的情况,请考虑使用抽象类:  

  • java应用程序中,有一些相关的类需要共享一些代码行,那么你可以将这些代码行放在抽象类中,并且这个抽象类应该由所有这些相关类进行扩展。

  • 您可以在抽象类中定义非静态或非最终字段,以便您可以通过方法访问和修改它们所属的对象的状态。

  • 您可以期望扩展抽象类的类具有许多公共方法或字段,或者需要除 public 之外的访问修饰符(例如 protected private)。

如果以下任何陈述适用于您的情况,请考虑使用接口:  

  • 它是一个完全的抽象,接口中声明的所有方法都必须由实现此接口的类来实现。

  • 一个类可以实现多个接口。它被称为多重继承。

  • 您想指定特定数据类型的行为,但不关心谁实现其行为。

来源:https://juejin.cn/post/7033654342313836575

标签:Java,抽象类,接口,区别
0
投稿

猜你喜欢

  • Spring使用AOP完成统一结果封装实例demo

    2021-12-16 18:49:06
  • mybatis的动态SQL和模糊查询实例详解

    2022-03-10 09:47:03
  • C++ Boost Fusion创建异构容器详解

    2021-12-30 23:52:58
  • C#实现String类型和json之间的相互转换功能示例

    2023-06-18 07:35:32
  • 分享Java常用几种加密算法(四种)

    2022-05-14 17:59:19
  • WPF实现动画效果(七)之演示图板

    2021-08-18 20:31:53
  • SpringMVC一步到位精通拦截器

    2023-11-25 01:47:45
  • Java类的继承实例详解(动力节点Java学院整理)

    2023-01-28 13:19:31
  • 安卓版微信小程序跳一跳辅助

    2022-08-30 13:44:20
  • Winform实现将网页生成图片的方法

    2022-09-06 13:39:31
  • android命令行模拟输入事件(文字、按键、触摸等)

    2021-10-30 04:48:06
  • 详解SpringBoot定制@ResponseBody注解返回的Json格式

    2023-07-26 13:47:02
  • 基于SpringBoot实现图片上传及图片回显

    2023-01-17 06:26:15
  • Java加载property文件配置过程解析

    2023-10-07 07:53:03
  • 关于Android HTML5 audio autoplay无效问题的解决方案

    2021-09-22 04:10:30
  • Java学习-打印1-1000以内的水仙花数代码实例

    2023-05-02 03:58:45
  • Android手势密码实现实例代码

    2023-04-13 20:17:51
  • C#通过NPOI操作Excel的实例代码

    2022-01-20 17:26:29
  • java使用POI操作excel文件

    2023-05-17 00:37:12
  • Java数据结构之链表、栈、队列、树的实现方法示例

    2021-10-07 10:40:29
  • asp之家 软件编程 m.aspxhome.com