网站首页 > 文章精选 正文
首先,从概念上来说,接口是对动作的抽象,只定义方法,不提供实现,它关注的是一个类能做什么。抽象类,即Abstract修饰的类,是对根源的抽象,既可以定义抽象方法,也可以提供方法的具体实现,它关注的是这个类是什么。抽象类是对象的抽象,接口是一种行为规范。
其次,从使用上来说,接口和抽象类都不能被实例化,抽象类用来被继承,接口用来被实现,Java中遵循单继承多实现,继承一个类实现多个接口。抽象类可以包含普通方法,也可以包含抽象方法,提供了更多的灵活性,但也带来了更高的定义代价,而接口只能定义方法的方法名,参数列表,返回类型,不关心具体细节,只是一个方法体,其中所有的方法都是抽象的。
此外,接口和抽象类在定义方法、属性、构造器和初始化块等方面也存在一些区别。接口中只能定义抽象方法和静态常量属性,声明方法必须用public来修饰(默认public),静态常量只能用public static final修饰,不能定义普通属性和方法。抽象类可以定义方法、属性和静态常量属性,还可以包含构造器和初始化块。抽象类中的成员变量可以被public private protected final等不同的修饰符来修饰。抽象类不能被实例化只能被继承,包含抽象方法的一定是抽象类,但是抽象类不一定含有抽象方法,抽象类中的抽象方法只有方法体,没有具体实现。构造方法不能用于实例化,主要用途是被子类调用由于抽象类的构造函数在实例化派生类之前发生,可以在这个阶段初始化抽象类字段或执行其它与子类相关的代码。这些差异使得接口和抽象类在使用场景和功能上有所不同。
抽象类
// 定义一个抽象类
public abstract class Animal {
// 抽象方法,没有具体实现
public abstract void makeSound();
// 普通方法,有具体实现
public void eat() {
System.out.println("Animal is eating.");
}
}
// 定义一个类,继承自Animal抽象类,并实现makeSound方法
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Woof!");
}
public static void main(String[] args) {
Dog dog = new Dog();
dog.makeSound(); // 输出:Woof!
dog.eat(); // 输出:Animal is eating.
}
}
接口
//接口
public interface Speakable {
//抽象方法,默认public
void speak();
//默认方法
defalut void defalutMethod(){
System.out.println("this is a defalut method in the interface!");
}
//静态方法
static void staticMethod(){
System.out.println("this is a static method in the interface!");
}
}
//实现类
public class Person implements Speakable {
@Override
public void speak() {
System.out.println("Hello!");
}
//可以选择重写默认方法,也可以不重写使用接口中的默认实现
@Override
defalut void defalutMethod(){
System.out.println("Overriding defalut method in the implementing class");
}
public static void main(String[] args) {
Person person = new Person();
person.speak(); //输出:Hello!
//接口中的静态方法直接通过接口名来调用
Speakable.staticMethod();
}
}
从Java 8开始,接口也可以包含默认方法(default methods)和静态方法(static methods)。抽象类不能被实例化,而接口也不能被实例化,但可以通过匿名内部类或Lambda表达式来实现接口的实例。
猜你喜欢
- 2025-04-05 深度剖析:Java接口与抽象类的差异及应用场景
- 2025-04-05 Java设计模式全面解析(java设计模式总结)
- 2025-04-05 抽象类(abstractclass)与接口(interface)有什么异同?
- 2025-04-05 C# 中抽象类与接口的选择(c# 抽象类的作用)
- 2025-04-05 自学java练习项目记录笔记(java自学资料)
- 2025-04-05 Java大师秘籍:接口与抽象类的终极解析,助你代码飞升!
- 2025-04-05 抽象类和接口编程思想(抽象类与接口的应用)
- 2025-04-05 接口和抽象类的共同点和区别(接口与抽象类的共同点)
- 2025-04-05 面试官-抽象类必须要有抽象方法吗?
- 2025-04-05 生活中有些不好理解的说太抽象了,那么Java中的抽象类是怎样的
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 稳压管的稳压区是工作在什么区 (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)