abstract类能写默认方法吗举例说明
时间: 2024-03-26 20:42:27 浏览: 69
当一个抽象类实现了一个接口时,它可以选择性地重写该接口中的默认方法,也可以不重写,这取决于它的具体需求。以下是一个使用默认方法的抽象类的示例:
```
interface Vehicle {
default void start() {
System.out.println("Vehicle started");
}
}
abstract class Car implements Vehicle {
// 不需要重写 start() 方法
}
class Sedan extends Car {
// 不需要重写 start() 方法
}
class Truck extends Car {
@Override
public void start() {
System.out.println("Truck started");
}
}
```
在这个示例中,`Vehicle` 接口包含一个默认方法 `start()`,表示所有车辆都可以启动。`Car` 是一个抽象类,它实现了 `Vehicle` 接口,但没有重写 `start()` 方法,因为它不需要特定的实现。`Sedan` 和 `Truck` 都是 `Car` 的具体实现,但只有 `Truck` 重写了 `start()` 方法,因为卡车的启动方式可能与其他车辆不同。
相关问题
java8中abstract类能写默认方法吗举例说明
是的,Java 8 中抽象类可以包含默认方法。以下是一个使用默认方法的抽象类的示例:
```
abstract class Animal {
public void eat() {
System.out.println("Animal is eating");
}
public abstract void makeSound();
public default void sleep() {
System.out.println("Animal is sleeping");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Dog is barking");
}
}
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Cat is meowing");
}
@Override
public void sleep() {
System.out.println("Cat is napping");
}
}
```
在这个示例中,`Animal` 是一个抽象类,它包含三个方法:`eat()`、`makeSound()` 和 `sleep()`。`eat()` 和 `makeSound()` 方法是抽象方法,需要在子类中实现。`sleep()` 方法是默认方法,有一个默认实现,但子类可以选择性地重写它。
`Dog` 和 `Cat` 都是 `Animal` 的具体实现,它们都必须实现 `makeSound()` 方法。 `Cat` 重写了 `sleep()` 方法,因为猫的睡眠方式可能与其他动物不同。
举例说明抽象类和接口的异同,用代码表示
抽象类和接口都是在面向对象编程中用于实现多态性和代码复用的重要机制,但它们有明显的区别:
**相同点:**
1. 都支持多态性:无论是通过继承抽象类还是实现接口,都可以创建出多种不同的行为版本。
2. 提供公共方法签名:抽象类和接口都定义了一组方法,其他类需要按照这些签名去实现。
**不同点:**
1. **实现方式**:
- 抽象类可以包含常量、变量、抽象方法(无方法体)、默认方法(子类可以选择覆盖也可以直接使用)。例如:
```java
abstract class Animal {
public abstract void sound();
private int age;
// 具体实现...
}
```
- 接口只包含常量(final修饰的变量)和抽象方法(无方法体),不允许提供具体实现。例如:
```java
interface IAnimal {
void sound();
}
```
2. **继承限制**:
- 类只能继承一个抽象类,但可以实现多个接口。例如:
```java
class Dog extends Animal implements IAnimal {
// 实现Animal和IAnimal的方法...
}
```
- 如果一个类实现了接口,那么它必须实现接口的所有方法,除非该接口已经被声明为`@FunctionalInterface`。
3. **实例化**:
- 抽象类本身不能实例化,通常是为了作为基类创建子类的对象。
- 接口也不能实例化,但可以创建接口的匿名内部类或者实现类的实例。
**
阅读全文