Java 中 抽象类 和 接口的不同点
众所周知,抽象是指隐藏功能的内部实现,只向用户显示功能。 例如:只显示它是做什么的,隐藏其如何实现的。 抽象类on)和接口都用于抽象,因此接口和抽象类是抽象的必需先决条件
方法类型 :接口只能有抽象方法。抽象类可以有抽象方法和非抽象方法。从 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