接口和抽象类
接口
• 接口中可以规定方法的原型:方法名、参数列表以及返回类型,但不规定方法主体;
• 也可以包含基本数据类型的数据成员,但它们都默认为static和 final。
接口的作用 :
- 是面向对象的一个重要机制
- 继承多个设计。
- 建立类和类之间的“协议”
▫ 将类根据其实现的功能分组用接口代表,而不必顾虑它所在的类继承 层次;
这样可以最大限度地利用动态绑定,隐藏实现细节;
▫ 实现不同类之间的常量共享。
接口的语法
• 声明格式为
[接口修饰符] interface 接口名称 [extends 父接口名]{
…//方法的原型声明或静态常量
}
• 接口的数据成员一定要有初值,且此值将不能再更改,可以省略 final关键字。
• 接口中的方法必须是“抽象方法”,不能有方法体,可以省略 public及abstract关键字。
实现接口:
public class 类名称 implements 接口名称 {
//在类体中实现接口的方法
//本类声明的更多变量和方法
}
【注】
▫ 必须实现接口中的所有方法;
▫ 来自接口的方法必须声明成public。
一个类可以实现多个接口,通过这种机制可实现对设计的多重继承。
语法:
[类修饰符] class 类名称 implements 接口1, 接口2, … {
… …
}
接口扩展
接口可通过扩展的技术派生出新的接口
▫ 原来的接口称为超接口(super interface);
▫ 派生出的接口称为子接口(sub interface)。
语法:
interface 子接口的名称 extends 超接口的名称1,超接口的名称2,… {
...
}
interface Shape{
double pi=3.14;
void setColor(String str);
}
//声明Shape2D接口扩展了Shape接口
interface Shape2D extends Shape {
double area();
}
class Circle implements Shape2D {
double radius;
String color;
public Circle(double r) {
radius=r;
}
public double area() {
return (pi*radius*radius);
}
public void setColor(String str){
color=str;
System.out.println("color="+color);
}
}
public class ExtendsInterfaceTester{
//测试类
public static void main(String []args) {
Circle cir;
cir=new Circle(2.0);
cir.setColor("blue");
System.out.println("Area = " + cir.area());
}
}
运行结果
color=blue
Area = 12.56
抽象类:(用abstract声明)
abstract class 类名{
//声明抽象方法
}
一个抽象派生的子类,子类通常提供父类的抽象方法的实现,如果子类中没有实现其父类中所有抽象方法,那么这个子类也必须声明为abstract。
抽象类和接口区别:
- 接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),而抽象类可以有非抽象的方法。
- 接口中除了 static、final 变量,不能有其他变量,而抽象类中则不一定。
- 一个类可以实现多个接口,但只能实现一个抽象类。接口自己本身可以通过 extends 关键字扩展多个接口。
- 接口方法默认修饰符是 public,抽象方法可以有 public、protected 和 default 这些修饰符(抽象方法就是为了被重写所以不能使用 private 关键字修饰!)。
- 从设计层面来说,抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为的规范。
本文深入探讨了接口和抽象类的概念,包括它们的定义、作用、语法和实现方式。对比了接口与抽象类的主要区别,如方法实现、变量类型、多重继承等特性,帮助读者理解面向对象设计的重要机制。
20万+

被折叠的 条评论
为什么被折叠?



