网站首页 > java教程 正文
共同点:
- 都不能被实例化:接口和抽象类都无法直接创建实例。它们是用来被其他类实现或继承的。
// 不能实例化接口
InterfaceExample example = new InterfaceExample(); // 错误
// 不能实例化抽象类
AbstractClassExample example = new AbstractClassExample(); // 错误
- 都可以包含抽象方法:这使得接口和抽象类可以定义一些必须在子类中实现的方法。
interface InterfaceExample {
void method();
}
abstract class AbstractClassExample {
abstract void method();
}
- 都可以有默认实现的方法:从 Java 8 开始,接口中可以使用 default 关键字定义默认方法,抽象类则一直可以包含具体方法。
interface InterfaceExample {
default void defaultMethod() {
System.out.println("This is a default method in an interface.");
}
}
abstract class AbstractClassExample {
void concreteMethod() {
System.out.println("This is a concrete method in an abstract class.");
}
}
区别:
- 目的和用途:
接口主要用于定义一组规范和行为约束,实现类必须实现接口中的所有方法。这种方式实现了行为的多态性。
抽象类主要用于代码复用和定义通用的属性和方法。子类可以继承抽象类并实现或覆盖其方法。
interface Animal {
void eat();
void sleep();
}
abstract class Mammal {
abstract void eat();
void breathe() {
System.out.println("Breathing...");
}
}
- 继承和实现:
一个类只能继承一个抽象类。
一个类可以实现多个接口。
class Dog extends Mammal implements Animal {
void eat() {
System.out.println("Dog is eating...");
}
public void sleep() {
System.out.println("Dog is sleeping...");
}
}
- 成员变量:
接口中的成员变量默认是 public static final,即常量,必须有初始值,不可更改。
抽象类中的成员变量可以有各种访问修饰符,可以被子类重新定义或赋值。
interface Constants {
int MAX_VALUE = 100; // public static final int MAX_VALUE = 100;
}
abstract class Shape {
protected String color;
abstract void draw();
}
class Circle extends Shape {
void draw() {
System.out.println("Drawing a circle");
}
}
实例与应用场景
接口的实际应用:
接口常用于定义一组通用行为,以实现不同类的多态性。例如,Java 中的 List、Set 和 Map 接口,它们提供了集合的行为,而具体实现则有 ArrayList、HashSet 和 HashMap 等。
java
List<String> list = new ArrayList<>();
list.add("Hello");
list.add("World");
for (String s : list) {
System.out.println(s);
}
抽象类的实际应用:
抽象类常用于创建一组具有共同特性的类。比如,定义一组不同形状的类,它们具有共同的属性(如颜色)和方法(如计算面积)。
java
abstract class Shape {
String color;
abstract double area();
public String getColor() {
return color;
}
}
class Circle extends Shape {
double radius;
Circle(String color, double radius) {
this.color = color;
this.radius = radius;
}
@Override
double area() {
return Math.PI * radius * radius;
}
}
class Rectangle extends Shape {
double length;
double width;
Rectangle(String color, double length, double width) {
this.color = color;
this.length = length;
this.width = width;
}
@Override
double area() {
return length * width;
}
}
public class Main {
public static void main(String[] args) {
Shape circle = new Circle("Red", 5);
Shape rectangle = new Rectangle("Blue", 4, 6);
System.out.println("Circle Area: " + circle.area());
System.out.println("Rectangle Area: " + rectangle.area());
}
}
性能比较
在大多数情况下,接口和抽象类的性能差异并不显著。然而,接口方法调用略慢于抽象类方法调用,因为接口方法需要通过动态分派,而抽象类方法则是通过虚方法表(vtable)调用的。这个差异在现代 JVM 中已经被大大优化,因此实际应用中很少成为瓶颈。
猜你喜欢
- 2024-10-04 “全栈2019”Java第九十六章:抽象局部内部类详解
- 2024-10-04 JAVA笔记(十)面向对象——接口和抽象类
- 2024-10-04 Java抽象类与接口的区别(java抽象类与接口的区别是什么)
- 2024-10-04 Java之路-08抽象类与接口(java抽象类入门教程)
- 2024-10-04 java基础——抽象类和接口(java抽象类和接口的使用场景)
- 2024-10-04 Java学习:基础(抽象类、模板方法模式、接口)
- 2024-10-04 Java学习:抽象方法和抽象类的使用
- 2024-10-04 Java中的抽象类与接口(java抽象类和接口的定义)
- 2024-10-04 java基础学习——abstract抽象类(java 抽象)
- 2024-10-04 JAVA之抽象类和接口(java抽象与接口)
你 发表评论:
欢迎- 06-15Linux中如何通过Shell脚本来控制Spring Boot的Jar包启停服务?
- 06-15推荐一款超棒的SpringCloud 脚手架项目
- 06-15IDEA将项目打包成jar包(idea打包普通java项目)
- 06-15Spring Boot3 项目 jar 包打包成 Docker 镜像全攻略
- 06-15记录Dockerfile将jar包构建成部署所需的镜像
- 06-15项目基础部署汇总八---linux下xxl-job安装
- 06-15Spring Boot Jar 包秒变 Docker 镜像实现多环境部署
- 06-15终端执行 java -jar example.jar 时报错:“没有主清单属性” 的解决
- 最近发表
-
- Linux中如何通过Shell脚本来控制Spring Boot的Jar包启停服务?
- 推荐一款超棒的SpringCloud 脚手架项目
- IDEA将项目打包成jar包(idea打包普通java项目)
- Spring Boot3 项目 jar 包打包成 Docker 镜像全攻略
- 记录Dockerfile将jar包构建成部署所需的镜像
- 项目基础部署汇总八---linux下xxl-job安装
- Spring Boot Jar 包秒变 Docker 镜像实现多环境部署
- 终端执行 java -jar example.jar 时报错:“没有主清单属性” 的解决
- 如何将本地JAR文件添加到Maven项目中
- Java 类隔离应用:多 Jar 包支持(java接口隔离原则)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)