Java中抽象类和接口有什么区别?

简介: 本文阐述了Java中抽象类和接口的区别,包括类型扩展、方法/属性访问控制符、方法实现、使用目的等方面的不同,并提供了抽象类和接口的使用示例,以及Java中其他类型的类(普通类、内部类等)的简介。

1、典型回答

接口和抽象类都是用来定义对象公共行为的,二者的主要区别有以下几点不同:

  1. 类型扩展不同:抽象类是单继承,而接口是多继承(多实现)
  2. 方法/属性访问控制符不同:抽象类方法和属性使用访问修饰符无限制,只是抽象类中的抽象方法不能被 private 修饰;而接口有限制,接口默认的是 public 控制符,不能使用其他修饰符
  3. 方法实现不同:抽象类中的普通方法必须有实现,抽象方法必须没有实现;而接口中普通方法不能有实现(JDK8 中 default 默认方法可以有实现)
  4. 使用目的不同:接口是为了定义规范,而抽象类是为了复用代码

还有以下几点:

  1. 抽象类可以包含抽象方法和非抽象方法,接口只能包含抽象方法(JDK8+可以有默认方法和静态方法),默认方法用 default 修饰。这里需要区分一下非抽象方法和默认方法,"非抽象方法" 并不是一个独立的概念,而是一个更加广泛的术语,可以包括抽象方法、默认方法以及普通的实例方法
  2. 抽象类可以有成员变量,但是接口中不能有成员变量(JDK8+可以有静态常量)
  3. 抽象类可以有构造方法,但接口不能有构造方法

2、全面剖析

为防止遗忘,这几个关键字在这里给出:

  • 抽象类通过 abstract 定义,子类通过 extends 继承
  • 接口通过 interface 定义,子类通过 implements 实现

抽象类是通过 abstract 关键字来定义的,用于表示一种抽象的类

抽象类的主要特征有以下几个:

  1. 通过 abstract 关键字来定义
  2. 抽象类不能被实例化,只能作为其他类的父类来继承和扩展使用
  3. 抽象类可以包含具体方法的实现,也可以包含抽象方法的定义

注:其他方面的特性,抽象类和普通类并无太大差别

抽象类的使用示例如下:

使用抽象类是用了复用代码,而使用接口是为了定义规范。它和接口的区别主要体现在:类型扩展不同、方法/属性访问控制符不同、方法实现不同,以及使用目的不同

3、知识扩展

Java中除了抽象类还有以下类:

普通类(Concrete Class):普通类是最常见的类,可以被直接实例化和使用。它可以包含成员变量、方法和构造方法等,并且可以定义自己的继承关系

内部类是定义在其他类内部的类。它可以访问外部类的属性和方法,也可以用于实现某些特定的功能。而内部类又有以下几种类型:

  • 非静态内部类(成员内部类):非静态内部类是定义在其他类内部的类,不被 static 修饰,它与外部类的实例相关联,非静态内部类可以访问外部类的所有成员(包括私有成员)
  • 静态内部类:静态内部类是定义在其他类内部的类,被 static 修饰,与外部类的实例无关。静态内部类可以访问外部类的静态成员,但不能直接访问外部类的非静态成员。静态内部类的实例化不依赖于外部类的实例
  • 局部内部类:局部内部类是定义在方法内部或代码块内部的类,它只能在所在方法或代码块中使用
  • 匿名内部类:匿名内部类是没有名字的内部类,它直接作为方法参数、方法返回值或赋值给变量使用。匿名内部类通常用于创建一个只需要使用一次的类,并且可以实现接口或继承抽象类来提供相应的方法实现。

非静态内部类(成员内部类)

静态内部类

局部内部类

匿名内部类

目录
相关文章
|
16天前
|
安全 Java API
Java 抽象类与接口在 Java17 + 开发中的现代应用实践解析
《Java抽象类与接口核心技术解析》 摘要:本文全面剖析Java抽象类与接口的核心概念与技术差异。抽象类通过模板设计实现代码复用,支持具体方法与状态管理;接口则定义行为规范,实现多态支持。文章详细对比了两者在实例化、方法实现、继承机制等方面的区别,并提供了模板方法模式(抽象类)和策略模式(接口)的典型应用示例。特别指出Java8+新特性为接口带来的灵活性提升,包括默认方法和静态方法。最后给出最佳实践建议:优先使用接口定义行为规范,通过抽象类实现代码复用,合理组合两者构建灵活架构。
32 2
|
21天前
|
存储 Java C语言
Java List 复制:浅拷贝与深拷贝方法及区别
我是小假 期待与你的下一次相遇 ~
|
21天前
|
JSON Java 数据库连接
|
16天前
|
算法 Java 数据库连接
Java 与 C++ 区别深入剖析及应用实例详解
本文深入剖析了Java和C++两种编程语言的区别,从编译与执行机制、面向对象特性、数据类型与变量、内存管理、异常处理等方面进行对比,并结合游戏开发、企业级应用开发、操作系统与嵌入式开发等实际场景分析其特点。Java以跨平台性强、自动内存管理著称,适合企业级应用;C++则因高性能和对硬件的直接访问能力,在游戏引擎和嵌入式系统中占据优势。开发者可根据项目需求选择合适语言,提升开发效率与软件质量。附面试资料链接:[点此获取](https://pan.quark.cn/s/4459235fee85)。
48 0
|
2月前
|
Java
Java 中 Exception 和 Error 的区别
在 Java 中,`Exception` 和 `Error` 都是 `Throwable` 的子类,用于表示程序运行时的异常情况。`Exception` 表示可被捕获和处理的异常,分为受检异常(Checked)和非受检异常(Unchecked),通常用于程序级别的错误处理。而 `Error` 表示严重的系统级问题,如内存不足或 JVM 错误,一般不建议捕获和处理。编写程序时应重点关注 `Exception` 的处理,确保程序稳定性。
|
3月前
|
Java 编译器 API
Java Lambda 表达式:以 Foo 接口为例深入解析
本文深入解析了 Java 8 中 Lambda 表达式的用法及其背后的函数式接口原理,以 `Foo` 接口为例,展示了如何通过简洁的 Lambda 表达式替代传统匿名类实现。文章从 Lambda 基本语法、函数式接口定义到实际应用层层递进,并探讨默认方法与静态方法的扩展性,最后总结常见误区与关键点,助你高效优化代码!
84 0
|
3月前
|
Java
java中一个接口A,以及一个实现它的类B,一个A类型的引用对象作为一个方法的参数,这个参数的类型可以是B的类型吗?
本文探讨了面向对象编程中接口与实现类的关系,以及里氏替换原则(LSP)的应用。通过示例代码展示了如何利用多态性将实现类的对象传递给接口类型的参数,满足LSP的要求。LSP确保子类能无缝替换父类或接口,不改变程序行为。接口定义了行为规范,实现类遵循此规范,从而保证了多态性和代码的可维护性。总结来说,接口与实现类的关系天然符合LSP,体现了多态性的核心思想。
80 0
|
8月前
|
Java
Java基础(13)抽象类、接口
本文介绍了Java面向对象编程中的抽象类和接口两个核心概念。抽象类不能被实例化,通常用于定义子类的通用方法和属性;接口则是完全抽象的类,允许声明一组方法但不实现它们。文章通过代码示例详细解析了抽象类和接口的定义及实现,并讨论了它们的区别和使用场景。
109 2
|
10月前
|
Java
Java——抽象类和接口
抽象类是一种不能被实例化的类,至少包含一个抽象方法(无实现体的方法),常用于定义一组相关类的共同特征,并强制子类实现特定方法。抽象方法不能被 `static` 或 `final` 修饰,且必须被重写。 接口则是一个完全抽象的类,用于规范类的行为。接口使用 `interface` 关键字定义,不能实例化,并且类与接口之间是实现关系。 内部类是在一个类内定义的类,分为成员内部类、静态内部类、局部内部类和匿名内部类。成员内部类可被修饰符修饰,静态内部类只能访问外部类的静态成员,局部内部类定义在方法内,匿名内部类则隐藏了名字,直接通过 `new` 关键字定义并实现接口或继承类。
64 5
Java——抽象类和接口

热门文章

最新文章