👏大家好!我是和风coding,希望我的文章能给你带来帮助!
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
📝点击 我的主页 还可以看到和风的其他内容噢,更多内容等你来探索!
📕欢迎参观我的个人网站:Gentlewind
抽象类和接口是 Java 中定义抽象类型的两种机制,他们之间有相似之处,但在使用场景上有一些区别。
抽象类
使用abstract
关键字定义,可以用来定义类,也可以定义方法。
作用:它的作用就是用来捕捉对象的通用属性和行为,而具体的实现交由子类来进行
一个抽象类可以包含抽象方法和具体方法。
抽象方法:没有实现的方法,也就是没有代码块{}
具体方法:实现了的方法
就比如我们定义了一个动物抽象类。每个动物都会叫,但是每个动物发出的声音都不一样,因此在动物这个抽象类中,我们不去对发出声音这个方法进行具体的定义,而是交由继承了它的子类来进行具体的实现。
这样的好处就是抽取了通用的属性和行为,对其子类具有指导作用。我不关心你具体如何实现,我只制定总体框架。
就如同西游记,佛祖让唐僧师徒要经历九九八十一难,这就是一个抽象类,而具体是哪八十一难?交由菩萨来自己定义。
abstract class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public String getName() {
return name;
}
public abstract void makeSound(); // 抽象方法
}
class Dog extends Animal {
public Dog(String name) {
super(name);
}
@Override
public void makeSound() {
System.out.println("Woof");
}
}
接口
使用interface
关键字定义。
主要用来定义一组方法,任何类实现该接口都必须实现接口中的所有方法(在Java 8及以后,接口也可以包含默认方法和静态方法)。
interface Flyable {
void fly(); // 抽象方法
}
interface Swimmable {
void swim(); // 抽象方法
}
class Duck implements Flyable, Swimmable {
@Override
public void fly() {
System.out.println("Duck is flying");
}
@Override
public void swim() {
System.out.println("Duck is swimming");
}
}
总结
抽象类: 适合用于表示一种“is-a”关系,作为基类捕捉子类的通用行为和状态。例如,Vehicle
可以是一个抽象类,而Car
和Truck
是它的子类。
接口:适合用于表示一种“can-do”关系,用来定义功能。例如,Serializable
接口表示对象可以被序列化,而Runnable
接口表示对象可以在某个线程中运行。
并且在 Java 中,每个子类只能集成一个抽象类,而一个类却可以实现多个接口。