Java 中 抽象类 和 接口的不同点

众所周知,抽象是指隐藏功能的内部实现,只向用户显示功能。 例如:只显示它是做什么的,隐藏其如何实现的。 抽象类on)和接口都用于抽象,因此接口和抽象类是抽象的必需先决条件

 

Java 抽象类vs接口

Java 抽象类vs接口

 

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

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

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

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

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

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

  • 数据成员的可访问性 :默认情况下,Java 接口的成员是 public 的。 Java 抽象类可以具有 private、protected 等类成员。

下面我们来看一个示例

import java.io.*;

abstractclassShape {

StringobjectName=" ";

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

publicvoidmoveTo(int x, int y)

{

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

+ "has been moved to"

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

}

abstractpublicdoublearea();

abstractpublicvoiddraw();

}

classRectangleextendsShape {

int length, width;

Rectangle(int length, int width, String name)

{

super(name);

this.length = length;

this.width = width;

}

@Overridepublicvoiddraw()

{

System.out.println("Rectangle has been drawn ");

}

@Overridepublicdoublearea()

{

return (double)(length * width);

}

}

classCircleextendsShape {

doublepi=3.14;

int radius;

Circle(int radius, String name)

{

super(name);

this.radius = radius;

}

@Overridepublicvoiddraw()

{

System.out.println("Circle has been drawn ");

}

@Overridepublicdoublearea()

{

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

}

}

publicclassGFG {

publicstaticvoidmain(String[] args)

{

Shaperect=newRectangle(2, 3, "Rectangle");

System.out.println("Area of rectangle: "

+ rect.area());

rect.moveTo(1, 2);

System.out.println(" ");

Shapecircle=newCircle(2, "Circle");

System.out.println("Area of circle: "

+ circle.area());

circle.moveTo(2, 4);

}

}

运行示例

上面的示例输出结果如下

Area of rectangle: 6.0

Rectangle has been moved to x = 1 and y = 2

Area of circle: 12.56

Circle has been moved to x = 2 and y = 4

如果我们在矩形和圆形之间没有任何共同的代码怎么办,可以使用接口。

import java.io.*;

interfaceShape {

voiddraw();

doublearea();

}

classRectangleimplementsShape {

int length, width;

Rectangle(int length, int width)

{

this.length = length;

this.width = width;

}

@Overridepublicvoiddraw()

{

System.out.println("Rectangle has been drawn ");

}

@Overridepublicdoublearea()

{

return (double)(length * width);

}

}

classCircleimplementsShape {

doublepi=3.14;

int radius;

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

@Overridepublicvoiddraw()

{

System.out.println("Circle has been drawn ");

}

@Overridepublicdoublearea()

{

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

}

}

publicclassGFG {

publicstaticvoidmain(String[] args)

{

Shaperect=newRectangle(2, 3);

System.out.println("Area of rectangle: "

+ rect.area());

Shapecircle=newCircle(2);

System.out.println("Area of circle: "

+ circle.area());

}

}

运行示例

上面示例编译执行结果如下

Area of rectangle: 6.0

Area of circle: 12.56

什么时候用接口,什么时候用抽象类?

如果下面中的任何一个适用于你的情况,考虑使用抽象类:

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

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

  • 可以在继承抽象类的类中设置许多 public 方法或字段,或者需要公共以外的访问修饰符(例如受保护和私有)。

如果下面中的任何一个适用于你的情况,考虑使用接口:

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

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

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

本文转载自:迹忆客(https://www.jiyik.com)

以上是 Java 中 抽象类 和 接口的不同点 的全部内容, 来源链接: utcz.com/z/290265.html

回到顶部