1-接口的介绍
-
接口 : 如果一个类中都是抽象方法 , 那么这个类应该是定义规则的类 , 我们应该把此类定义成接口,接口是一种引用数据类型
-
作用 :
-
用于定义规则
-
程序的扩展性
-
2- 接口的定义和特点
-
定义接口的关键字使用interface
-
public interface 接口名{ ... }
-
-
类与接口之间的关系是实现关系 , 用关键字implements进行连接
-
public class 类名 implements 接口名 { ... }
-
-
接口不能实例化
-
接口的子类我们叫做实现类
-
要么重写接口中所有的抽象方法
-
要么实现类是一个抽象类
-
-
注意 : 类与接口的关系是实现关系 , 一个类可以实现多个接口,调用逗号分隔 , 还可以继承一个类的同时 , 实现多个接口
3-接口的特性
- 接口中的方法默认是
public abstract
的,可以省略这些修饰符。 - 接口中的字段默认是
public static final
的,可以省略这些修饰符。 - 接口不能被实例化,但可以被实现(类实现接口)。
- 一个类可以实现多个接口,从而获得这些接口的所有方法规范。
4-接口案例
假设我们有一个接口 Shape
,用于表示各种形状的基本行为:
// Shape.java
public interface Shape {
// 常量声明:接口中的常量默认为 public static final
double PI = 3.14;
// 抽象方法声明:所有实现类必须实现这些方法
double calculateArea();
double calculatePerimeter();
}
在上面的接口 Shape
中,我们定义了两个抽象方法 calculateArea()
和 calculatePerimeter()
,并声明了一个常量 PI
。所有实现了 Shape
接口的类都必须提供这两个方法的具体实现。
接下来,我们可以创建几个不同形状的类来实现 Shape
接口,比如 Circle
和 Rectangle
:
// Circle.java
public class Circle implements Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double calculateArea() {
return PI * radius * radius;
}
@Override
public double calculatePerimeter() {
return 2 * PI * radius;
}
}
// Rectangle.java
public class Rectangle implements Shape {
private double length;
private double width;
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
@Override
public double calculateArea() {
return length * width;
}
@Override
public double calculatePerimeter() {
return 2 * (length + width);
}
}
现在我们可以在主程序中使用这些类,并根据需要调用接口中定义的方法,而无需关心具体是哪种形状:
// Main.java
public class Main {
public static void main(String[] args) {
Shape circle = new Circle(5);
Shape rectangle = new Rectangle(4, 6);
System.out.println("Circle area: " + circle.calculateArea());
System.out.println("Circle perimeter: " + circle.calculatePerimeter());
System.out.println("Rectangle area: " + rectangle.calculateArea());
System.out.println("Rectangle perimeter: " + rectangle.calculatePerimeter());
}
}
在上面的示例中,我们创建了一个 Circle
和一个 Rectangle
对象,并调用了它们的 calculateArea()
和 calculatePerimeter()
方法,这些方法由 Shape
接口定义。这种做法使得我们可以轻松地在不同的形状对象之间切换,并利用接口定义的方法来获取相应的面积和周长,实现了代码的灵活性和可维护性。
5-枚举
枚举(Enumeration)在Java中是一种特殊的数据类型,它允许我们定义一个带有固定常量集合的数据类型。枚举常常用于表示一组相关的常量,比如星期几、月份、状态等。
定义枚举类型
在Java中定义枚举类型非常简单,使用 enum
关键字即可:
// 定义一个枚举类型表示星期几
public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}
在上面的例子中,我们定义了一个名为 Day
的枚举类型,包含了一周中的所有天。每个枚举常量都是 Day
类型的实例,可以像访问普通类的静态常量一样使用。
使用枚举类型
一旦定义了枚举类型,我们就可以在程序中使用它们:
public class EnumExample {
public static void main(String[] args) {
Day today = Day.MONDAY;
switch(today) {
case MONDAY:
System.out.println("Today is Monday.");
break;
case TUESDAY:
System.out.println("Today is Tuesday.");
break;
// 其他case语句省略
default:
System.out.println("Today is another day.");
break;
}
}
}
在上述示例中,我们将 today
设置为 Day.MONDAY
,然后使用 switch
语句检查 today
的值,并根据不同的枚举常量执行不同的操作。
枚举方法和属性
枚举类型可以拥有字段、方法和构造函数。例如,我们可以为枚举类型添加字段和方法来提供更多的信息或行为:
public enum Day {
SUNDAY("Sunday"), MONDAY("Monday"), TUESDAY("Tuesday"),
WEDNESDAY("Wednesday"), THURSDAY("Thursday"), FRIDAY("Friday"),
SATURDAY("Saturday");
private String displayName;
// 构造函数
Day(String displayName) {
this.displayName = displayName;
}
// 自定义方法
public String getDisplayName() {
return displayName;
}
}
在上面的例子中,我们为每个枚举常量添加了一个
displayName
字段,并提供了一个构造函数来初始化这个字段。还添加了一个 getDisplayName()
方法,以便在需要时获取枚举常量的显示名称。
总结
枚举是Java中一种非常有用的数据类型,它提供了一种更加类型安全和易读的方式来表示固定集合的常量。使用枚举可以提高代码的可读性和可维护性,同时避免使用普通常量集合时可能出现的错误。