首页 > 编程语言 >Java 深入学习(3) —— 抽象类(Abstract Class) 与 接口(Interface)的区别

Java 深入学习(3) —— 抽象类(Abstract Class) 与 接口(Interface)的区别

时间:2023-06-06 22:00:48浏览次数:42  
标签:Java Abstract 接口 抽象 Interface 抽象类 方法 public


抽象类(Abstract Class)


Java 提供一个叫 抽象方法 的机制,这种方法是不完整的,仅有声明而没有方法体。

abstract void f();

包含抽象方法的类叫做 抽象类。如果一个类包含一个或者多个抽象方法,则该类必须被限定为抽象的。

如果从一个抽象类继承,并想创建该新类的对象,就必须为基类中的所有抽象方法提供方法定义。

使某个类成为抽象类并不需要所有的方法都是抽象的,所以仅仅需要将某些方法生命为抽象的即可。


接口(Interface)


interface关键字 产生一个完全抽象的类,它根本没有提供任何具体实现。它允许创建者确定方法名、参数列表、返回类型,但是没有任何方法体。接口中提供了形式,而未提供任何具体实现。

interface关键字 前面添加 public 关键字(仅限于该接口在于其同名的文件中被定义)。

如果不添加 public 关键字,则它只具有包访问权限,这样它就只能在同一个包内使用。

接口也可以包含,但这些域隐式的是 staticfinal的。

可以选择在接口中显示地将方法声明为 public,但即使不这么做,它们也是 public 的。

使用接口的核心原因:

  1. 为了能够向上转型为多个基类型
  2. 防止客户端程序员创建该类的对象,并确保这仅仅是建立一个接口

接口优于抽象类的原因


最明显的区别:
抽象类允许包含某些方法的实现,但是接口则不允许。

更为重要的区别:
为了实现由抽象类定义的类型,类必须成为抽象类的一个子类。因为Java 只允许单继承,所以,抽象类作为类型定义受到了极大地限制。

原因:

1、现有的类可以很容易被更新,以实现新的接口。

例如:当Comparable接口被引入到Java平台中时,会更新许多现有的类,以实现 Comparable接口。一般来说,无法更新现有的类来扩展新的抽象类。

2、接口是定义mixin(混合类型)的理想选择。

例如:Comparable是一个mixin接口,它允许类表明它的实例可以与其他的可相互比较的对象进行排序。这样的接口之所以被称为 mixin,是因为它允许任选的功能可被混合到类型的主要功能中。

3、接口允许构造非层次结构的类型框架。

例如:我们有一个接口代表一个singer,另一个接口代表一个songwriter。但有些 singer 本身也是 songwriter。这种情况不适合层次结构。

Reference


  1. 《Java编程思想》第九章接口 P170
  2. 《Effective Java》第18条,接口优于抽象类 P82
  3. 深入理解Java的接口和抽象类


标签:Java,Abstract,接口,抽象,Interface,抽象类,方法,public
From: https://blog.51cto.com/u_16152603/6428555

相关文章

  • Java抽象类总结
        final与abstract互斥final目的是绝育,abstract目的是让子类继承并重写......
  • Java代码实现带时区时间字符串转为LocalDateTime对象
    不带时区时间字符串可以使用Java8中的DateTimeFormatter类来将字符串转换为LocalDateTime对象。下面是一个示例代码:importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;publicclassDateTimeConversionExample{publicstaticvoidmain(String[......
  • JavaScript复制内容到剪切板
     复制内容到剪切板分两种情况,一种是从页面已有的可选元素中选中内容进行复制,一种是将Javascript代码中的字符串直接复制到剪切板。复制页面元素选中内容       html代码:     <inputtype="textarea"id="txt"/>     <buttononclick="copy()">复制</button>......
  • java代码格式化和静态分析检查
    java代码格式化和静态分析检查引言:在Java软件开发过程中,开发团队往往要花费大量的时间和精力发现并修改代码缺陷。Java静态代码分析(staticcodeanalysis)工具能够在代码构建过程中帮助开发人员快速、有效的定位代码缺陷并及时纠正这些问题,从而极大地提高软件可靠性并节省软件开......
  • Java类加载机制
    <1>Javac原理javac是用于将源码文件.java编译成对应的字节码文件.class。其步骤是:源码——>词法分析器组件(生成token流)——>语法分析器组件(语法树)——>语义分析器组件(注解语法树)——>代码生成器组件(字节码)<2>类加载过程先在方法区找class信息,有的话直接调用,没有的话则使用类加......
  • java8函数式编程
    1.什么是函数式编程每个人对函数式编程的理解不尽相同。但其核心是:在思考问题时,使用不可变值和函数,函数对一个值进行处理,映射成另一个值。2.Lambda表达式Stream<String>stream=Stream.of("张三","李四");2.1collect(toList())List<String>names=stream.collect(Colle......
  • HttpURLConnection调用webservice,c#、java、python等HTTP调用webservice,简单的webserv
    以前调用webservice一般使用axis、axis2先生成java类后,直接引用,多方便。但是有的webservice接口非常的函数,生成的java类非常多,有没有一种非常简化的方法。axis2有不生成类直接调用的方法,但是QName不容易找,每次查N久不到。有的反馈,使用CXF调用一样方便,但CXF还要使用maven下载jar,而......
  • Java中输入字符串的方法
     Scannerinput=newscanner();Stringcode=input.next();错误写法://Stringcode=input.toString(); 1、输入字符串遇到空格或者换行结束Scannersc=newScanner(System.in);Stringstr=newString();str=sc.next();2、输入一行字符串,可以包括空格Scannersc=ne......
  • 第一章 JavaEE应用和开发环境
    1.1javaEE应用概述1、javaEE的分层模型数据库--【提供持久化服务】--》DomainObject层--【封装】--〉DAO层--【提供数据访问服务】--》业务逻辑层--【提供业务逻辑实现】--〉MVC的控制器层--【显示】--》前端优点:松耦合2、JavaEE应用的组件1)前端组件:主要负责收集用户......
  • 记录--你真的能区分JavaScript的各种导入导出方式吗?
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助前言......