java的接口和抽象类

云南北大青鸟设计培训告诉你如何区分Java中抽象类接口

理解抽象类

abstractclass和interface在Java语言中都是用来进行抽象类,所有的成员方法都是abstract的。从某种意义上说,interface是一种非凡形式的abstractclass。

从编程的角度来看,abstractclass和interface都可以用来实现“designbycontract”的思想。但是在具体的使用上面还是有一些区别的。

首先,abstractclass在Java语言中表示的是一种继续关系,一个类只能使用一次继续关系。但是,一个类却可以实现多个interface。也许,这是Java语言的设计者在考虑Java对于多重继续的支持方面的一种折中考虑吧。

其次,在abstractclass的定义中,我们可以赋予方法的默认行为。但是在interface的定义中,方法却不能拥有默认行为,为了绕过这个限制,必须使用委托,但是这会增加一些复杂性,有时会造成很大的麻烦。

在抽象类中不能定义默认行为还存在另一个比较严重的问题,那就是可能会造成维护上的麻烦。因为假如后来想修改类的界面(一般通过abstractclass或者interface来表示)以适应新的情况(比如,添加新的方法或者给已用的方法中添加新的参数)时,就会非常的麻烦,可能要花费很多的时间(对于派生类很多的情况,尤为如此)。但是假如界面是通过abstractclass来实现的,那么可能就只需要修改定义在abstractclass中的默认行为就可以了。

同样,假如不能在抽象类中定义默认行为,就会导致同样的方法实现出现在该抽象类的每一个派生类中,违反了“onerule,oneplace”原则,造成代码重复,同样不利于以后的维护。因此,在abstractclass和interface间进行选择时要非常的小心。

从设计理念层面看abstractclass和interface

上面主要从语法定义和编程的角度论述了abstractclass和interface的区别,这些层面的区别是比较低层次的、非本质的。大理电脑培训认为本小节将从另一个层面:abstractclass和interface所反映出的设计理念,来分析一下二者的区别。认为,从这个层面进行分析才能理解二者概念的本质所在。

java的接口和抽象类

抽象类和接口的区别

一、两者相同点

1、不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。

2、抽象类里的抽象方法必须全部被子类所实现,子类不能全部实现父类抽象方法,那么该子类还只能是抽象类。一个类实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。

二、两者不同点 

1、默认的方法实现

抽象类可以有默认的方法实现;接口,Java8规定可以为接口提供默认实现的方法并且不用强。

2、实现

制子类来重写子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要重写抽象类中的抽象方法;接口子类使用关键字implements 来实现接口,它需要重写接口中没有默认。

3、构造器

抽象类可以有构造器,接口不能有构造器。

4、与正常Java类的区别

除了不能实例化抽象类之外,和普通Java类没有任何区别;接口是完全不同的类型外。

5、访问修饰符

抽象方法可有public.protected和default、abstract修饰符。不能用privatestatic.synchronize、 native 修饰。

接口属性默认修饰符是publicstatic final (必须赋初值) ,方法默认修饰符是publicabstract. Java8 开始出现静态方法,多加static关键字。

6、main方法

并且可以运行它;接口没有main方法,因此不能运行它。

7、多继承

抽象类可以继承一个类和实现多个接口;接口只可以继承一个或多个接口。

抽象类的运用意义

在面向对象方法中,抽象类主要用来进行类型隐藏。构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。

这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。

由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。

为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。

北大青鸟java培训:Java抽象类与接口的区别?

在Java语言中,abstractclass和interface是支持抽象类定义的两种机制。

正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。

abstractclass和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstractclass和interface的选择显得比较随意。

其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正确、合理。

本文将对它们之间的区别进行一番剖析,试图给开发者提供一个在二者之间进行选择的依据。

 理解抽象类abstractclass和interface在Java语言中都是用来进行抽象类(本文中的抽象类并非从abstractclass翻译而来,它表示的是一个抽象体,而abstractclass为Java语言中用于定义抽象类的一种方法,请读者注意区分)定义的,那么什么是抽象类,使用抽象类能为我们带来什么好处呢?在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。

并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。

比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。

正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。

在面向对象领域,抽象类主要用来进行类型隐藏。

我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。

这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。

模块可以操作一个抽象体。

由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。

熟悉OCP的读者一定知道,为了能够实现面向对象设计的一个最核心的原则OCP(Open-ClosedPrinciple),抽象类是其中的关键所在。

从语法定义层面看abstractclass和interface在语法层面,Java语言对于abstractclass和interface给出了不同的定义方式,下面以定义一个名为Demo的抽象类为例来说明这种不同。

使用abstractclass的方式定义Demo抽象类的方式如下:abstractclassDemo{ abstractvoidmethod1(); abstractvoidmethod2(); ? }使用interface的方式定义Demo抽象类的方式如下:interfaceDemo{ voidmethod1(); voidmethod2(); ? }在abstractclass方式中,Demo可以有自己的数据成员,也可以有非abstract的成员方法,而在interface方式的实现中,Demo只能够有静态的不能被修改的数据成员(也就是必须是staticfinal的,不过在interface中一般不定义数据成员),所有的成员方法都是abstract的。

从某种意义上说,interface是一种特殊形式的abstractclass。

从编程的角度来看,abstractclass和interface都可以用来实现”designbycontract”的思想。

但是在具体的使用上面还是有一些区别的。

首先,abstractclass在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系(因为Java不支持多继承–转注)。

但是,一个类却可以实现多个interface。

也许,这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。

其次,在abstractclass的定义中,我们可以赋予方法的默认行为。

但是在interface的定义中,方法却不能拥有默认行为,为了绕过这个限制,必须使用委托,但是这会增加一些复杂性,有时会造成很大的麻烦。

在抽象类中不能定义默认行为还存在另一个比较严重的问题,那就是可能会造成维护上的麻烦。

因为如果后来想修改类的界面(一般通过abstractclass或者interface来表示)以适应新的情况(比如,添加新的方法或者给已用的方法中添加新的参数)时,就会非常的麻烦,可能要花费很多的时间(对于派生类很多的情况,尤为如此)。

但是如果界面是通过abstractclass来实现的,那么可能就只需要修改定义在abstractclass中的默认行为就可以了。

同样,如果不能在抽象类中定义默认行为,北大青鸟贵阳计算机学院认为会导致同样的方法实现出现在该抽象类的每一个派生类中,违反了”onerule,oneplace”原则,造成代码重复,同样不利于以后的维护。

因此,在abstractclass和interface间进行选择时要非常的小心。

java接口与抽象类有什么区别?

一个是接口,一个是抽象类,接口这相当于你定义了一些规范,然后下面的用这个规范去开发

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年3月24日 23:11:58
下一篇 2024年3月24日 23:18:38

相关推荐

  • javanio解包,java游戏解包

    java代码求完整代码谢谢 1、如果要在页面上显示,可以使用scriplet或者表达式语言都可以,我想这些你应该都会了吧。但是正规的写法应当是使用EL表达式语言和jstl来显示。 2、stuInfo.print(studentList); }}代码的逻辑结构应该蛮清晰的。 heapbuffer报文java怎么解析我们可以很清楚的发现,这两个方法都是实例化He…

    2024年5月13日
    4100
  • java倒过来的俄罗斯方块,基于java的俄罗斯方块设计与实现

    急需一份俄罗斯方块源代码,Java写的 以下为一个俄罗斯方块的源代码,以—线分隔一个类。郁闷太长了,不能全部粘贴上来,要的话在线M我吧。 将包解压,里面的俄罗斯方块.jar可直接运行(要求电脑有jre)程序包粘贴到eclipse或myeclipse的java工程下即可运行。 你是cs还是bs呀?把方块弄出来需要你看书上的图形部分。不是一句话两句话…

    2024年5月13日
    2800
  • java阻塞线程池,java线程池默认阻塞队列

    阻塞队列和线程池原理 1、java线程池的实现原理很简单,说白了就是一个线程集合workerSet和一个阻塞队列workQueue。当用户向线程池提交一个任务(也就是线程)时,线程池会先将任务放入workQueue中。 2、线程池中的核心线程数。当提交一个任务时,线程池创建一个新线程执行任务,直到当前线程数等于corePoolSize;如果当前线程数为cor…

    2024年5月13日
    3300
  • java编译器1.5的简单介绍

    java:jdk1.4和jdk1.5的有那些区别(越详细越好)? 1、没多大区别,只要你注意别用那些过时的方法就行,若是新版本加的或有改变的方法,docs里会说的,在方法解释下面jdk0将会有很大变化增强的for循环 为了迭代集合和数组,增强的for循环提供了一个简单、兼容的语法。 2、和5最大的区别有两个,一个是5有泛型,另一个5可以自动封装八大基本数据类…

    2024年5月13日
    7100
  • java软件注册码生成.pdf,java 注册

    怎么用java动态生成pdf文档 1、首先,您需要在 Java 程序中添加 Spire.Xls.jar 文件作为依赖项。您可以从这个链接下载 JAR 文件;如果您使用 Maven,则可以通过在 pom.xml 文件中添加以下代码导入 JAR 文件。 2、iText是着名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通…

    2024年5月13日
    4100
  • javalistiterator用法,java jlist用法

    javaarraylist的方法有哪些 创建ArrayList的List接口 例:List books = new ArrayList();Java支持泛形后,创建的同时可以指定元素的类型。 Java中ArrayList的构造方法 public ArrayList(Collection? extends E c)API的意思是“构造一个包含指定 collec…

    2024年5月13日
    3000
  • javarpc以太坊,以太坊jsonrpc接口

    DApp开发入门 1、本文仅介绍以太坊系列的DApp开发,其他链原理差不太多。 2、DApp是Decentralized Application的缩写,中文叫分布式应用/去中心化应用,是基于区块链底层开发平台建立的,比如以太坊和EOS。DApp与底层平台的关系,就好比APP与IOS和Android系统。 3、以太坊客户端,其实我们可以把它理解为一个开发者工具…

    2024年5月13日
    3700
  • java打印类成员,java打印类名

    新手。java怎么打印类中的对象啊 因为直接输出一个类的对象的时候,会调用这个类的toString()方法,这个方法有些类是覆盖了的,比如String,Integer。 使用System.out.println()输出,默认都加上了toString()方法,Java中的类都继承自Object对象,Object对象就有toString()方法。 ArrayLi…

    2024年5月13日
    3400
  • java二维数组相加,java怎么给二维数组赋值

    java,一个二维数组中元素相加求和 1、使用 数组的length属性 即可限定循环的上边界。 2、以M行N列二维数组为参数进行方法调用,分别计算二维数组各列元素之和,返回并输 出所计算的结果。 3、} return 0;} 如果要不小于某个值,出现冲突的情况肯定是得出的数小于指定值。可以将每行升序排序。 4、其中,如果i=n-i+1,则这一行只加n,不用加…

    2024年5月13日
    3500
  • java执行本地html文件,java调用html文件

    javaweb运行html文件时跳转别的java文件怎么办? 把A.txt文件包装成File,然后调用File里的 String path = file.getAbsolutePath();就可以完成你需要的东西了。String paths = ;//此处填写A.txt的父路径。 打比方html是一种图纸,浏览器是工人,工人(浏览器)根据图纸(自定义的htm…

    2024年5月13日
    3300

发表回复

登录后才能评论



关注微信