接口:

接口,英文interface,在java中,泛指供别人调用的方法或函数。接口是对行为的一种抽象。

语法:

[public] interface InterfaceName{}

注意:

1)接口中的变量会被隐式(只能)定义为 public static final;

2)接口中的方法会被隐式(只能)定义为 public abstract;

3)接口中的所有方法都不能有具体实现(只能是抽象方法);

4)接口不能实例化(因为接口中的方法都是抽象的,没有方法体);

5)一个类可以实现多个接口(用 , 分隔);

6)接口可以继承一个或多个其他接口;

7)一个类要实现某个接口,必须实现接口中的所有方法。

为什么一定要使用接口?

1)接口被用来描述一种行为的抽象;

2)java只支持单继承,但可以通过接口来弥补这一缺陷;

3)接口也被用来解耦。

一个栗子:

public interface CalInterface {
public static final float PI=3.1415926f;
public abstract float getArea(float r);
float getCircumference(float r);
} public class Cire implements CalInterface{ public float getArea(float r) {
float s = PI*r*r;
return s;
} public float getCircumference(float r) {
float c = 2*PI*r;
return c;
} public static void main(String[] args) {
Cire cire = new Cire();
float area = cire.getArea(7.8f);
System.out.println("圆的面积是:"+area); float cm = cire.getCircumference(7.8f);
System.out.println("圆的周长是:"+cm);
}
}

控制台输出:

圆的面积是:191.13449
圆的周长是:49.008842

抽象类:

抽象方法:抽象方法是一种特殊的方法,它只有声明而没有具体的实现。

格式:

abstract void fun();

注意:

1)抽象方法必须使用abstract关键字来修饰;

2)如果一个类中含有抽象方法,则称这个类为抽象类,抽象类必须用abstract关键字修饰;

3)抽象类中含有无具体实现的方法,所以,不能使用抽象类创建对象(抽象类不能实例化);

4)抽象类中不仅只包含抽象方法,同样也可以拥有成员变量和普通的成员方法。

抽象类与普通类的区别?

1)抽象方法必须由public或protected修饰,缺省条件下默认为public;

2)抽象类不能用来创建对象;

3)如果一个类继承抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为abstract类。

除了这三点,抽象类与普通类并没什么区别。

格式:

[public] abstract class ClassName{

  abstract void fun();

}

关于抽象类与接口的区别?

1、语法层面上的区别:

1)抽象类可以提供成员方法的实现细节,而接口中只能存在 public abstract方法;

2)抽象类中的成员变量可以是各种类型的,而接口中只能是 public static final 类型;

3)抽象类中可以有静态代码块和静态方法,而接口中不能有静态代码块或静态方法;

4)一个类只能继承一个抽象类,而一个类可以实现多个接口。

2、设计层面上的区别:

  抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对一个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。举个简单的例子,飞机和鸟是不同类的事物,但是它们都有一个共性,就是会飞。那么我们在设计的时候,可以将飞机设计为类Airplane,将鸟设计为类Bird,但是不能将飞行这个特性也设计为类,因为它只是一个行为特征,并不是对一类事物的抽象描述。此时可以将飞行设计成接口Fly,包含方法fly(),然后Airplane和Bird分别根据自己的需要实现Fly这个接口。然后至于有不同种类的飞机,比如战斗机,民用飞机等直接继承Airplane即可,对于鸟也是类似的,直接继承Bird即可。从这里可以看出,继承是一个“是不是”的关系,而接口实现则是一个“有没有”的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是有没有,具不具备的关系,比如鸟是否能飞,能飞则实现Fly接口,不能飞就不用实现。

  抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。什么是模板式设计?举个最简单的例子,如果用PPT模板A设计了PPT B 和PPT C ,那么B和C的公共部分就是A了,如果它们的公共部分需要改动,则只需要改动模板A即可,不需要重新对B和C进行改动。而辐射式设计,比如某个电梯都安装了某种报警器,一旦要更新报警器,就必须全部更新。也就是说,对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,那实现这个接口的全部类都必须进行相应的变更。

一个栗子:

是网上最流行的门与警报的栗子:门都有open()和close()两个动作,现在我们需要门有报警alarm()功能,那我们该如何实现?下面提供两种思路:

1)将这三个功能都放在抽象类里面,但是这样一来所有继承于这个抽象类的子类都具备了报警的功能,但有时候门不需要报警的功能;

2)将这三个类都放在接口里面,需要用到报警功能的类就需要实现这个接口中的open(),close(),但也许这个类根本就不具备这两个功能,比如火灾报警器。

从上面分析我们知道,Door的open(),close()和alarm()根本就属于两个不同范畴内的行为,open()和close()属于门本身固有的行为特征,而alarm()属于延伸的附加行为,因此最好的解决办法就是单独将报警设计为一个接口,包含alarm()行为,Door设计为一个抽象类,包含open,close两种行为。再设计一个报警门继承Door类实现Alarm接口。

public abstract class Door {
abstract void open();
abstract void close();
} public interface Alarm {
void alarm();
} public class AlarmDoor extends Door implements Alarm{ @Override
public void alarm() {
// TODO Auto-generated method stub
}
@Override
void open() {
// TODO Auto-generated method stub
}
@Override
void close() {
// TODO Auto-generated method stub
}
}

贴一张抽象类与接口的对比图:

参考:https://www.cnblogs.com/dolphin0520/p/3811437.html

图:http://www.importnew.com/12399.html

Java_接口与抽象类的更多相关文章

  1. java_接口和抽象类的区别

    1. 接口只能定义抽象方法,不包含已经提供实现的方法. 抽象类可以包含普通方法 2. 接口不能定义静态方法.抽象类可以定义静态方法 3. 接口里只能定义静态常量filed,不能定义普通filed. 抽 ...

  2. 从接口、抽象类到工厂模式再到JVM来总结一些问题

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习! 涉及到的知识点总结如下: 为什么使用接口? 接口和抽象类的区别 简单工厂模式总结 Java中new和newInstance的区别 J ...

  3. (转)深入理解Java的接口和抽象类

    原文地址: http://www.cnblogs.com/dolphin0520/p/3811437.html 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP ...

  4. c++ 接口和抽象类

    其实对抽象类与接口的区别一直是搞不太清楚,最近正在学习<设计模式>,期间用到了很多c++多态的知识.这是才恍然发现,是应该整理下这方面的知识了.但在翻阅书本.上网查阅资料之际,发现有篇文章 ...

  5. android中接口和抽象类的区别

    最近发现很多基础有点生疏了,特地写一点博客来巩固一下.今天主要来谈谈接口和抽象类的区别,我们在项目的很多地方都会用到接口或者抽象类,但是它们之间的一些区别和相同点不知道大家有没有注意到,还有就是,什么 ...

  6. 深入理解Java的接口和抽象类(转)

    深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...

  7. c#接口与抽象类的区别

    abstract 修饰符用于表示所修饰的类是不完整的,并且它只能用作基类.抽象类与非抽象类在以下方面是不同的: 抽象类不能直接实例化,并且对抽象类使用 new 运算符是编译时错误.虽然一些变量和值在编 ...

  8. Java接口和抽象类的区别

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

  9. 深入理解Java的接口和抽象类

    深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...

随机推荐

  1. REM方案总结

    flexible.js方案 1.设置根元素字体大小为屏幕宽度的十分之一. 2.即根元素字体大小与屏幕宽度的比例为:1/10. jQuery.weui的rem设计方案 1.以屏幕宽度375px为基础,根 ...

  2. js 个人笔记

    /* * Created by lsw 2018-06 */ ; (function (window) { //js ready var ie = !!(window.attachEvent & ...

  3. 项目Alpha冲刺(团队)-第五天冲刺

    格式描述 课程名称:软件工程1916|W(福州大学) 作业要求:项目Alpha冲刺(团队)-代码规范.冲刺任务与计划 团队名称:为了交项目干杯 作业目标:描述第五天冲刺的项目进展.问题困难.心得体会 ...

  4. CentOS6.5 下在Nginx中添加SSL证书

    原文:https://www.cnblogs.com/wuling129/p/5039978.html 证书过期 ,更新证书,记录下 一.安装相关支持库:(未实践) yum -y install gc ...

  5. hbase学习一 shell命令操作

    基本操作: #命名空间级别: #列出所有命名空间 hbase> list_namespace #新建命名空间 hbase> create_namespace 'ns1' #删除命名空间 h ...

  6. 【webpack系列】从零搭建 webpack4+react 脚手架(二)

    html文件如何也同步到dist目录?bundle.js文件修改了,万一被浏览器缓存了怎么办?如何为导出的文件加md5?如何把js引用自动添加到html?非业务代码和业务代码如何分开打包?如何搭建开发 ...

  7. haproxy快速安装

    haproxy是一款提供负载均衡的代理服务器,它可基于modetcp 实现伪四层调度,还可以基于modehttp实现七层调度,类似于nginx,因为他没有web服务所以不像nginx那样进行控制. 通 ...

  8. python分支——if

    单分支判断 age = 16 if age >= 18: 判断语句,判断age是否大于等于18,注意if后面要加空格,条件写完后要加: print("你已经成年") prin ...

  9. 1.XGBOOST算法推导

    最近因为实习的缘故,所以开始复习各种算法推导~~~就先拿这个xgboost练练手吧. (参考原作者ppt 链接:https://pan.baidu.com/s/1MN2eR-4BMY-jA5SIm6W ...

  10. Windows10远程报错:由于CredSSP加密Oracle修正导致远程失败

    解决方案:Windows 10 家庭版,没有 gpedit.msc,只能修改本地电脑的注册表,在本地“运行”输入: regedit   按以下目录进入:HKEY_LOCAL_MACHINE\Softw ...