“合抱之木,生于毫末;九层之台,起于累土。” 很多人对基础知识的巩固不够重视。Java 基础就如同大厦的基石,没有稳固的基石,再宏伟的架构也只是空中楼阁。
检验知识是否学得牢固,有一个比较好的办法,假设现在有个面试官问你这个问题,你是否脑瓜子嗡嗡的呢?
为了全面掌握基础知识,我们计划形成基础知识100问,破解大多数的JAVA面试涉及到的基础问题,不用去背八股文,掌握好基础就能灵活应对面试官的提问。
往期我们讨论过的主题有:
1. Java 基本数据类型有哪几种?它们各自所占的字节数是多少?
这里补充一下默认值
byte、short、int的默认值为0
long的默认值为0L
float的默认值为0.0f
double的默认值为0.0d
char的默认值为'\u0000'
boolean的默认值为false
2. JAVA自动装箱和拆箱是如何实现的?在什么场景下会自动发生?
3. Java中的String、StringBuilder和StringBuffer的区别,以及各自的适用场景
4. JAVA技术第4问:==和equals方法在比较对象时的区别是什么?在自定义类中如何正确重写equals方法
5. JAVA技术第5问:Java中的final关键字有哪些作用?分别应用在类、方法和变量上时会有什么效果?
今天咱们是第六问,探讨的内容是:"什么是Java中的抽象类和接口?它们之间有什么区别?在什么情况下应该使用抽象类,什么情况下应该使用接口?"
试想一下,如果不往下看,你是否能够完整地回答出这个问题呢? 如果答案是肯定的,那恭喜你,你可以节约些时间去学习别的知识了! 当然,“温故而知新”,如果您不忙的话,接着往下看也无妨。
1.抽象类
在Java中,抽象类是一种不能被实例化的类,它主要用于作为其他类的基类,提供一些通用的属性和方法。抽象类可以包含抽象方法和非抽象方法。
抽象方法
是一种只有声明而没有实现的方法,需要在子类中进行具体实现。
非抽象方法
具有完整的方法体,子类可以直接继承使用。
以下是一个抽象类的示例:
// 定义一个抽象类 Animal
abstract class Animal {
// 抽象方法,子类必须实现
public abstract void sound();
// 非抽象方法,子类可以直接继承使用
public void sleep() {
System.out.println("Animal is sleeping.");
}
}
// 定义一个 Dog 类继承自 Animal 类
class Dog extends Animal {
@Override
public void sound() {
System.out.println("Woof!");
}
}
2. 接口
接口是一种特殊的抽象类型,它只包含常量和抽象方法。接口中的所有方法默认都是抽象的,所有字段默认都是public static final(常量)。接口主要用于定义一组规范,让实现类去实现这些规范。
以下是一个接口的示例:
// 定义一个接口 Flyable
interface Flyable {
// 接口中的常量
int MAX_SPEED = 100;
// 抽象方法,实现类必须实现
void fly();
}
// 定义一个 Bird 类实现 Flyable 接口
class Bird implements Flyable {
@Override
public void fly() {
System.out.println("Bird is flying.");
}
}
3. 抽象类和接口的区别
语法层面
成员变量
抽象类可以有普通成员变量,而接口中的成员变量只能是public static final类型的常量。
方法
抽象类可以包含抽象方法和非抽象方法,而接口中的方法默认都是抽象的(Java 8 及以后版本支持默认方法和静态方法)。
继承和实现
一个类只能继承一个抽象类,但可以实现多个接口。
设计层面
抽象类
表示的是一种“is-a”的关系,即子类是抽象类的一种具体实现,用于代码复用和提供通用的行为。
接口
表示的是一种“can-do”的关系,即实现类具备接口所定义的能力,用于定义规范和实现多态。
4. 使用场景
使用抽象类的场景
当多个类具有一些共同的属性和方法,并且这些类之间存在“is-a”的关系时,可以使用抽象类。例如,不同种类的动物都有吃、睡等行为,可以将这些行为抽象到一个抽象的Animal类中。
当需要为子类提供一些默认的实现时,可以使用抽象类。抽象类中的非抽象方法可以为子类提供通用的实现,子类可以直接继承使用。
使用接口的场景
当需要定义一组规范,让不同的类去实现这些规范时,可以使用接口。例如,不同的交通工具都可以有“移动”的能力,可以定义一个Moveable接口,让汽车、飞机等类去实现这个接口。
当需要实现多继承的效果时,可以使用接口。由于 Java 不支持类的多继承,但一个类可以实现多个接口,因此可以通过实现多个接口来达到类似多继承的效果。
本文暂时没有评论,来添加一个吧(●'◡'●)