接口:
定义了一组方法规范,但不提供这些方法的具体实现。
接口的作用:
-
定义规范:接口主要用于定义一个规范,规定了实现该接口的类必须遵守的规则。
-
实现多继承:一个类可以实现多个接口,从而继承多个接口中定义的方法。
-
解耦合:接口提供了一种解耦合的方式,使得代码更加灵活。通过接口,可以实现代码的模块化和组件化,使得系统更加易于维护和扩展。
抽象类:
是一种不能被直接实例化的类,通常用来作为其他类的基类。抽象类可以包含抽象方法和具体方法,它提供了一种方式来定义一个类的基本框架,同时允许派生类提供具体的实现。
抽象类的例子:
public abstract class Animal {
public abstract void makeSound(); // 抽象方法
public void eat() { // 具体方法
System.out.println("This animal is eating.");
}
}
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Woof woof!");
}
}
抽象方法:
面向对象编程中的一种方法,它在抽象类或接口中被声明,但没有具体的实现。抽象方法的存在是为了定义一个方法的签名(即方法名、参数列表和返回类型),并要求任何继承该抽象类或实现该接口的子类必须提供这些方法的具体实现。
抽象方法的例子:
public abstract class Animal {
public abstract void makeSound(); // 抽象方法
}
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Woof!");
}
}
public class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Meow!");
}
}
-------------------------接口和抽象类的区别------------------------------------------
-
定义方式:
- 抽象类:使用关键字
abstract
定义。 - 接口:使用关键字
interface
定义。
- 抽象类:使用关键字
-
实现/继承:
- 抽象类:一个类只能继承一个抽象类(单继承)。
- 接口:一个类可以实现多个接口(多继承)。
-
构造函数:
- 抽象类:可以有构造函数。
- 接口:不能有构造函数。
- 构造函数的例子
-
public abstract class Animal { // 抽象类的构造函数 protected Animal() { System.out.println("Animal created."); } } // 继承抽象类的子类 public class Dog extends Animal { // 调用抽象类的构造函数 public Dog() { super(); // 调用父类的构造函数 System.out.println("Dog created."); } }
public interface Flyable { // 接口中的方法 void fly(); } // 实现接口的类 public class Plane implements Flyable { // 实现类可以有构造函数 public Plane() { System.out.println("Plane created."); } }
-
方法重写:
- 抽象类:子类可以重写抽象类中的抽象方法和具体方法。
- 接口:所有实现接口的类都必须重写接口中的所有方法(除非接口中的方法被标记为默认方法)。