抽象类是一个包含抽象方法的类,它不能被实例化。抽象方法是一种没有方法体的方法,它只包含方法的签名。抽象类可以包含普通的方法,也可以包含抽象方法,而普通方法可以有方法体。
abstract class Shape {
// 抽象方法
abstract void draw();
// 普通方法
void display() {
System.out.println("Displaying shape");
}
}
接口是一种抽象类型,它定义了一组方法的签名,但没有提供方法的实现。在Java中,类可以实现一个或多个接口。接口中的方法默认是public
、abstract
的,可以省略这些修饰符。
interface Drawable {
// 抽象方法
void draw();
// 默认方法
default void display() {
System.out.println("Displaying drawable");
}
}
在使用抽象类和接口时,我们需要考虑它们的特点和适用场景。
public
、static
、final
的。extends
关键字实现继承。implements
关键字实现接口。public
、static
、final
的。public
、static
、final
)。public
、protected
、default
(包内可见)。public
,字段默认为public
、static
、final
。public
、default
(包内可见)两种修饰符。在选择抽象类或接口时,应考虑以下几个因素:
abstract class Animal {
abstract void makeSound();
}
class Dog extends Animal {
void makeSound() {
System.out.println("Bark");
}
}
class Cat extends Animal {
void makeSound() {
System.out.println("Meow");
}
}
interface Shape {
void draw();
}
class Circle implements Shape {
void draw() {
System.out.println("Drawing Circle");
}
}
class Rectangle implements Shape {
void draw() {
System.out.println("Drawing Rectangle");
}
}
在实际开发中,接口与抽象类可以结合使用,以发挥它们各自的优势。一个类可以继承一个抽象类同时实现多个接口,这样可以同时享受到抽象类的代码复用和接口的多继承特性。
abstract class Shape {
abstract void draw();
}
interface Colorable {
void setColor(String color);
}
class ColoredCircle extends Shape implements Colorable {
private String color;
void draw() {
System.out.println("Drawing Colored Circle");
}
public void setColor(String color) {
this.color = color;
}
}
在Java 8中引入了接口的默认方法,这使得接口可以包含非抽象的方法实现。这样的默认方法可以为现有的接口添加新的功能,而不会影响实现该接口的类。