今天看到项目中,写了一个抽象类,里面有很多方法继承了这类,当调用这个接口时,采用的是这个抽象类去调方法的,当时一想,这个不就是我们说的Java的多态的特征:

继承:存在继承关系的子类和父类

重写:子类对父类的某些方法进行重写(多态下调用的是子类重写的方法)

父类引用指向子类对象:即向上转型,将子类的引用赋给父类的对象

然后,我们调用的时候,就是通过父类的对象去调用方法的。但是,一想接口好像也可以实现多态,并不是抽象类才可以,我们只要多个类实现同一个接口,也可以实现多态,

因此,转着转着,就转到了接口和抽象类的区别了。

接口

接口是一序列方法的声明,一序列方法特征的集合,一个接口只有方法的形状而没有方法的具体实现,接口是Java面向对象提供的一种机制。

Java语言是一种单继承的,在类的继承中可以实现多个接口代替了多继承

接口的申明:

public interface 接口类名称{

}

抽象类

抽象类是描述许多类的公共的地方,它是一个基类,在项目中主要用作很多类的基础类,比如对表中的增删改查,我们可以抽取一个基类来,然后让表结构的类去继承它,这样就省的我们去写那些基本的增删改查了

抽象类的申明:

public abstract 抽象类名称{

}

接口和抽象类的区别

接口和抽象类还是有一定区别的,接口可以看做是抽象类的一种更抽象化,接口是对动作(行为)的抽象,抽象类是对类的抽象,简单的来说,就是接口注重的是方法,而抽象类注重的是属性和方法

接口:

方法完全抽象的,并且方法必须是public,如果写成其他的编译时会报错,如果不写,则默认方法是public abstract

子类用implements来实现接口,子类需要实现接口中的所有方法

接口不可以new操作符实例化一个接口,但可以声明一个接口变量

接口可以继承一个或者多个接口

接口可以有变量,但是这个变量是不可以变的变量,它会自动的变为public static final

抽象类:

可以有方法的实现,但是这个方法不是abstract方法

子类用extends来继承抽象类,如果子类不是抽象类,则子类必须实现抽象类中的所有抽象方法,也可以实现抽象类中的非抽象方法

抽象类中可以有构造器

抽象类中可以有public,protected和default修饰符

抽象类可以继承一个类和实现多个接口

总的区别是:

抽象类可以有构造函数,接口不可以有构造函数

抽象类中可以有普通成员变量,接口中没有普通成员变量,只能有常量

抽象类中的方法可以被static修饰,接口中的方法不可以被static修饰

抽象类中可以有普通方法和抽象方法,接口中的方法全是抽象方法

抽象中的方法可以被public,protected等修饰符修饰,接口中的方法全都是public abstract的方法,如果省略修饰符,则默认的也都是public abstract修饰

一个类只能继承一个抽象类,接口可以被多实现,即一个类只能继承一个类,可以实现多个接口

什么时候使用接口,什么时候使用抽象类

如果你想拥有一些方法,并且这些方法有默认实现,那么久使用抽象类

如果你想实现多继承,那么就是用接口吧,java不支持多继承,但是可以实现多个接口

接口主要用于模块与模块之间的调用

抽象类主要用于当做基础类使用,即基类

Java接口和抽象类的区别的更多相关文章

  1. JAVA基础知识|java虚拟机(JVM)

    一.JVM简介 java语言是跨平台的,兼容各种操作系统.实现跨平台的基石就是虚拟机(JVM),虚拟机不是跨平台的,所以不同的操作系统需要安装不同的jdk版本(jre=jvm+类库:jdk=jre+开 ...

  2. Java基础知识强化18:抽象类、接口的区别 和 选择性实现接口方法

    1.抽象类和接口的区别 抽象类里面可以有非抽象的方法(可以没有抽象方法),接口里只能有抽象方法. 抽象类中的抽象方法声明时不能有大括号,而接口中的所有方法都没有大括号.  抽象类(abstract c ...

  3. java基础知识(6)---抽象类与接口

    抽象类: abstract抽象:不具体,看不明白.抽象类表象体现.在不断抽取过程中,将共性内容中的方法声明抽取,但是方法不一样,没有抽取,这时抽取到的方法,并不具体,需要被指定关键字abstract所 ...

  4. [java基础知识]java安装步骤

    jre:  java运行环境.  jre =  java虚拟机 + 核心类库(辅助java虚拟机运行的文件).如果只是运行java程序,只需要安装jre.    jdk: java开发工具集   jd ...

  5. java基础知识——Java的定义,特点和技术平台

    (作者声明:对于Java编程语言,很多人只知道怎么用,却对其了解甚少.我也是其中一员.所以菜鸟的我,去查询了教科书以及大神的总结,主要参考了<Java核心技术>这本神作.现在分享给大家!) ...

  6. JAVA基础知识总结7(抽象类 | 接口)

    抽象类: abstract 1.抽象:不具体,看不明白.抽象类表象体现. 2.在不断抽取过程中,将共性内容中的方法声明抽取,但是方法不一样,没有抽取,这时抽取到的方法,并不具体,需要被指定关键字abs ...

  7. java 基础知识(java web 方面的)

    1.java面向对象的基本特征:封装性,多态性,继承性. 2.Java的泛型:iterator接口主要有hasnext()方法,next()方法,remove()方法:collection接口继承了i ...

  8. Java基础知识 String StringBuffer StringBuilder三者的区别(面试题)

    相同点:String.StringBuffer.StringBuilder最终底层存储与操作的都是char数组,StringBuffer和StringBuilder都继承了AbstractString ...

  9. [转] Java基础知识——Java语言基础

    http://blog.csdn.net/loneswordman/article/details/9905931 http://blog.csdn.net/wanghuan203/article/d ...

  10. java基础知识精华

    转载:https://www.jianshu.com/p/6c078abb720f java基础知识 java内存模型 java运行时数据区域 hashMap 如何解决冲突 存储方式 冲突达到一定数量 ...

随机推荐

  1. Swift学习之熟悉控件

    最近是比较清闲一些的,对于一个开发者来说,这也是一个很好的充电机会.以前做项目都是使用Objective-C去开发,但我们都知道,Swift语言从2014年的出现到现在,一步一步变的完善,渐渐变的受欢 ...

  2. Logback配置连接

    logback 简介 logback 常用配置详解(一)<configuration> and <logger> logback 常用配置详解(二)<appender&g ...

  3. unix shell命令

    man  commandxx    查看某个命令的使用说明 权限---------------------- chmod o+wx   testfile  给某个目录权限 chmod 777 READ ...

  4. DFS序+线段树 hihoCoder 1381 Little Y's Tree(树的连通块的直径和)

    题目链接 #1381 : Little Y's Tree 时间限制:24000ms 单点时限:4000ms 内存限制:512MB 描述 小Y有一棵n个节点的树,每条边都有正的边权. 小J有q个询问,每 ...

  5. Code First 关系配置整理

    之前EF一直有性能问题以及使用便利性问题, 终于到了EF6有了Migrations之后, 小弟也决定加入EF阵营了. 在学习FluentAPI配置关系的时候, 发现网上的好几个教程实际上博主自己都没有 ...

  6. 热浪[TYVJ1031]

    描述 德克萨斯纯朴的民眾们这个夏天正在遭受巨大的热浪!!!他们的德克萨斯长角牛吃起来不错,可是他们并不是很擅长生產富含奶油的乳製品.Farmer John此时以先天下之忧而忧,后天下之乐而乐的精神,身 ...

  7. 栈的JS实现

    栈,是一种特殊的线性表,其插入及删除的操作都在线性表的同一端进行.这一端称为栈顶,另一端称为栈底.就类似于餐厅里的一摞盘子,后放的盘子在上方,也会先被人拿走.栈具有"后进先出"的逻 ...

  8. JavaScript-String基础知识

    1.字符串可以0个或多个字符串放在一起:     " ' '    ".'""' . "\"\""       2.写法 ...

  9. Linux培训薪资过万是真事 星创客为嵌入式高端培训树标杆

    10月26日,是华清远见星创客嵌入式精英训练营首期班结业后的第15个工作日,虽然目前的学员就业成果已经超出了训练营老师们的预期,但就业工作仍然在继续进行着没有停止. 从训练营老师方面得出的统计数据,截 ...

  10. js获取浏览器高度

    常用: JS 获取浏览器窗口大小 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 // 获取窗口宽度 if (window.innerWidth) winWidth = ...