Java8接口和抽象类和方法
4
在 Java 8 中,接口和抽象类都是用于实现抽象和多态性的重要工具。它们允许定义一个规范(方法签名),而具体的实现则由子类完成。
接口 (Interface)
接口就像一个契约,规定了实现它的类必须提供哪些方法。
特点:
- 只能包含抽象方法 (Java 8 之前) 和 默认方法 (Java 8 开始) 以及 静态方法 (Java 8 开始)。
- 可以包含常量,默认是
public static final
的。 - 不能被实例化。
- 一个类可以实现多个接口。
用途:
- 定义规范和契约,提高代码的灵活性和可扩展性。
- 实现多态性,允许不同类型的对象以相同的方式处理。
- 模拟多重继承。
例子:
// 定义一个接口
interface Drawable {
void draw(); // 抽象方法
default void resize() { // 默认方法
System.out.println("Resizing the shape.");
}
}
// 实现接口的类
class Circle implements Drawable {
@Override
public void draw() {
System.out.println("Drawing a circle.");
}
}
抽象类 (Abstract Class)
抽象类是一个不能被实例化的类,它可以包含抽象方法和具体方法。
特点:
- 可以包含抽象方法和具体方法。
- 可以包含成员变量。
- 不能被实例化。
- 一个类只能继承一个抽象类。
用途:
- 为子类提供通用的方法实现。
- 定义抽象方法,强制子类实现特定的功能。
例子:
// 定义一个抽象类
abstract class Shape {
String color;
public Shape(String color) {
this.color = color;
}
public abstract void draw(); // 抽象方法
public void fill() { // 具体方法
System.out.println("Filling the shape with color " + color);
}
}
// 继承抽象类的子类
class Rectangle extends Shape {
public Rectangle(String color) {
super(color);
}
@Override
public void draw() {
System.out.println("Drawing a rectangle.");
}
}
区别
特性 | 接口 | 抽象类 |
---|---|---|
方法 | 只能包含抽象方法、默认方法和静态方法 | 可以包含抽象方法和具体方法 |
变量 | 只能包含常量 | 可以包含成员变量 |
构造方法 | 没有 | 可以有 |
继承 | 可以实现多个接口 | 只能继承一个抽象类 |
实例化 | 不能被实例化 | 不能被实例化 |
如何选择
- 优先使用接口,因为它提供了更大的灵活性。
- 当需要为子类提供通用的方法实现时,使用抽象类。
- 当需要表示一种抽象概念,并且不需要为子类提供任何实现时,使用接口。
方法
在 Java 中,方法是类的核心组成部分,用于定义对象的行为。Java 提供了多种方法类型,以满足不同的编程需求。以下是抽象方法、默认方法、普通方法和静态方法之间的区别:
1. 抽象方法 (Abstract Method)
-
定义: 只有方法声明,没有方法体的方法。
-
关键字:
abstract
-
位置: 只能存在于抽象类或接口中。
-
目的: 定义子类必须实现的通用方法,确保所有子类都具有特定行为。
-
示例:
abstract class Animal { public abstract void makeSound(); // 抽象方法,没有方法体 }
2. 默认方法 (Default Method)
-
定义: 在接口中提供默认实现的方法,使用
default
关键字修饰。 -
关键字:
default
-
位置: 只能存在于接口中。
-
目的:
- 扩展接口功能,而无需修改现有实现类。
- 解决接口演化问题,避免因新增方法而导致大量类需要修改。
-
示例:
interface Drawable { void draw(); default void resize() { // 默认方法,提供默认实现 System.out.println("Resizing the shape."); } }
3. 普通方法 (Instance Method)
-
定义: 类中定义的非静态方法,需要通过对象实例调用。
-
关键字: 无特定关键字。
-
位置: 类中。
-
目的: 定义对象的实例行为,依赖于对象的具体状态。
-
示例:
class Circle { int radius; public double calculateArea() { // 普通方法,需要对象实例调用 return Math.PI * radius * radius; } }
4. 静态方法 (Static Method)
-
定义: 使用
static
关键字修饰的方法,属于类本身,不依赖于对象实例。 -
关键字:
static
-
位置: 类中。
-
目的:
- 提供工具类功能,例如数学计算、字符串操作等。
- 定义与对象实例无关的操作。
-
示例:
class MathUtils { public static int sum(int a, int b) { // 静态方法,属于MathUtils类 return a + b; } }
总结:
特性 | 抽象方法 | 默认方法 | 普通方法 | 静态方法 |
---|---|---|---|---|
关键字 | abstract |
default |
无 | static |
方法体 | 无 | 有 | 有 | 有 |
所属 | 抽象类/接口 | 接口 | 类 | 类 |
调用方式 | 子类必须实现 | 实现类可继承或重写 | 对象实例调用 | 类名调用 |
目的 | 定义通用方法规范 | 扩展接口功能 | 定义对象实例行为 | 提供工具类功能/与实例无关的操作 |
Java8接口和抽象类和方法
http://152.53.84.24:8090/archives/java8jie-kou-he-chou-xiang-lei-he-fang-fa