java学习面向对象之接口
上一节当中我们说道抽象类,抽象类当中的方法可以是抽象的也可以是非抽象的,那么当抽象类中所有方法都是抽象的时候,我们就可以把它重新定义为接口。代码示例:
abstract class Animal
{ abstract void eat();
abstract void goToBed(); }
上述代码写成接口的形式为:
interface Animals
{ public void eat();
public void goToBed(); }
在接口当中的方法,也只能是方法名称,没有方法体。
类与类当中存在的关系是继承关系,那么类与接口之间是什么关系呢?类与接口之间的关系就是实现的关系,类实现接口。类与类当中只能够单继承,作为体系的扩展延伸,但是类与接口之间的实现,就对类做了功能上的扩展。同时接口的出现,也是java支持多继承的表现。虽然java不支持类的多继承,但是java中接口是可以多实现的,也就是说可以做到跟多继承相像的多功能上的扩展。并且,实现和继承是可以同时实现的。
类与接口的实现:
比如我们现在有个笔记本电脑,笔记本电脑是继承自电脑的,具有电脑所有的功能,但是笔记本本身又特有,折叠这个特殊的功能。我们可以这样定义,笔记本电脑继承自电脑这个抽象类,同时实现了折叠的这个功能。我们用代码来体现下:
/**
*抽象类Pc抽取出了Pc当中必须实现的
*一些功能
*/
abstract class Pc
{
/**
*抽象类方法connectNet(),实现连接网络的方法
*没有返回值
*/
abstract void connectNet();
/**
*抽象类方法hasMouse(),实现电脑都有鼠标的功能
*没有返回值
*/
abstract void hasMouse(); } /**
*接口ZheDie,提供折叠的功能
*/
interface ZheDie
{
/**
*zheDie()提供折叠的方法
*没有返回值
*/
public abstract void zheDie(); } /**
*笔记本电脑继承了电脑这个体系,证明笔记本电脑是属于电脑的
*,具有电脑的所有功能以及属性。同时他又实现了折叠,这个特殊的
*功能。
*/
class BookPc extends Pc implements ZheDie
{
/**
*实现了连网功能
*/
public void connectNet()
{ System.out.println("BookPc can connectNet"); }
/**
*实现了鼠标功能
*/
public void hasMouse()
{ System.out.println("BookPc has a Mouse"); }
/**
*实现了折叠的功能
*/
public void zheDie()
{ System.out.println("BookPc can be zheDie"); } } class InterDemo2
{ public static void main(String[] args) { new BookPc().zheDie(); } }
接口当中除了有方法之外,还可以有属性:
interface Demo
{ public static final int a = ; }
那么接口都有哪些细节需要注意呢?
1、接口不同于类,接口的定义方法是interface关键字不是class关键字。
2、接口只能被类用implement关键字实现不能被类继承,但是接口与接口之间可以被继承
3、接口可以实现类的多继承,也就是多实现。
4、接口中的方法都是抽象的并且是公开的,包括属性,也就是接口当中的属性还有方法前面的修饰词都是固定的。如果不加修饰词的情况下,在编译的时候会给加上的。
5、接口当中的方法还有成员变量都是公开的。成员函数用public abstract修饰,成员变量用public static final 修饰。因为类是实现接口,而不是继承接口。
6、接口当中的方法,必须被要实现这个接口的类全部实现。否则,这个实现了这个接口的类就是一个抽象类。
7、接口的出现,避免了单继承的局限性
java利用接口实现多继承:
在java当中不支持多继承,因为这样存在不确定性方法一样,不知道调用哪个?。但是java当中为了支持多继承,就用了“多实现”。多继承的意义存在于:提供功能,提高扩展性。
一个类可以实现多个接口。
interface A
{ public void show1(); } interface B
{ public void show2(); } class Test implements A,B //这个地方就体现了java通过多实现的方式,实现了多继承
{ public void show1()
{ System.out.print("Show1()"); } public void show2()
{ System.out.print("Show2()"); } } class InterDemo3
{ public static void main(String[] args) { Test t = new Test();
t.show1();
t.show2(); } }
多实现需要注意的地方:
1、多实现的时候,由于没有方法体,就没有了两个方法,同时具有不同的方法体,且当实现的时候不知道该实现哪个方法这个不确定性的隐患。因为即使一个类实现了多个接口的时候,多个接口当中又具有相同方法的时候,这个时候相同的方法都是抽象方法,并且这些个抽象的方法在被类实现的时候,就被一个方法覆盖了,所以并不存在不确定性。
2、在抽象方法当中,返回值可以定义,方法接收的参数也是可以定义的。
interface A
{ public void show(); } interface B
{ public void show(int a,int b); } class Test implements A,B
{ public void show()
{ System.out.print("Show1()"); } public void show(int a , int b)
{ System.out.print("a + b = "+(a+b)); } } class InterDemo3
{ public static void main(String[] args) { Test t = new Test();
t.show();
System.out.println();
t.show(,); } }
这个样子写是正确的,但是这个样子写就是错误的:
interface A
{ public void show(); } interface B
{ public int show();//这样子写是错误的 } class Test implements A,B
{ public void show()
{ System.out.print("Show1()"); } public int show()
{ return ; } } class InterDemo3
{ public static void main(String[] args) { Test t = new Test();
t.show();
System.out.println();
t.show(); } }
这个就叫做,调用的不确定性。
接口与接口之间的关系,接口与接口之间是继承关系,并且是多继承的关系。因为接口当中的抽象方法,就避免了不确定性,比如:
interface AA
{ public void show1(); } interface BB
{ public void show2(); } interface CC extends AA,BB
{ }
这个就是接口与接口之间的继承关系,并且是多继承关系。
这样,当一个类实现CC这个接口的时候,就同时必须实现两个方法,即:
class Test implements CC
{ public void show1(){}
public void show2(){} }
接口的特点:
1、接口是对外曝露的规则;
2、接口是对程序的扩展;
3、接口能够降低程序的耦合性;
4、接口可以用来多实现。
5、类与接口之间是实现的关系,一个类可以继承自一个类的同时,实现多个接口。而接口与接口之间是继承且是多继承的关系。
为了更形象的说明这个特点,我们来举一个例子来说一下,就拿笔记本电脑的这个例子来说:
早期的笔记本电脑是没有usb接口的,因为早期的笔记本电脑是把所需要的功能直接嵌入到笔记本当中,这样我们就可以用了。但是这个时候就出现了一个问题,就是如果我们不习惯笔记本的触摸板,想把触摸板替换成鼠标的话,我们就需要把笔记本拆开,并且把触摸板上面的两个线接入到鼠标上面,这样鼠标就可以使用了。同时如果我们这个时候笔记本键盘坏掉了,我们应该怎么办呢,我们也需要把笔记本拆开把键盘上的线引出来 ,接到我们完好的键盘上面。在做这些事情的时候,我们就会发现一个问题,这样来回的接线,会显得我们的笔记本电脑不够人性化,我们就在想,如果我们在生产笔记本的时候,可以预先保留几个特定规格的且有特定规则的接口,来供我们使用,这样就大大提高了笔记本的扩展性,和使用性。比如说,笔记本的生产厂家,在生产笔记本的时候,提前预留了这个接口。同时,鼠标、键盘厂家也按照这个接口做了一些鼠标和键盘出来,这样当我们不想用原装的时候,就可以利用这个usb接口直接接外接的键盘或者鼠标。这就就显得方便了许多,同样我们电脑主板上面也有许多这样的接口,不如PCI接口啊,内存接口啊,等等之类的。
我们用代码来体现的话就是:
interface Usb
{ public void open();
public void close(); } class UMouse implements Usb
{ public void open()
{ System.out.println("Mouse has opened"); } public void close()
{ System.out.println("Mouse has closed"); } } class UKeypbord implements Usb
{ public void open()
{ System.out.println("Keybord has opened"); } public void close()
{ System.out.println("Keybord has closed"); } } class BookPc
{ public static void main(String[] args) { BookPc b = new BookPc();
b.method(null);
b.method(new UMouse());
b.method(new UKeypbord());
} private void method(Usb u)
{
if(u!=null){
u.open();
u.close();
}
} }
这里来说一下 这个例子是如何体现接口的特点的:
1、定义接口,这个时候提供了给外界使用,并且鼠标、键盘厂商必须实现的两个方法,设备的关闭和开启。这个就是对外曝露的规则。
2、因为在笔记本出厂之前就实现了对这个功能的扩展,所以这个也是对笔记本电脑功能上的扩展。
3、同时在利用接口的同时,就不用把所有的代码都写在笔记本这个类当中,这样就降低了程序的耦合性,这样当我们要增加外加设备的时候,比如说要增加一个usb摄像头,这个时候,我们 就可以在外边定义一个摄像头的类,然后实现usb这个接口中的所有方法,之后,在pc当中直接调用就好了。
以上就是接口的好处还有优点。
接口和抽象类的异同点总结:
1、共性:都是不断抽取出来的抽象概念。
2、异性一:抽象类体现继承关系,一个类只能单继承。接口体现实现的关系,一个类可以多实现。
3、异性二:抽象类是继承,是is a关系,在定义该体系当中基本共性的内容。接口是实现,是like a关系,在定义体系额外功能。举个例子来说,学生都具有学习的功能,但是打架的功能就是额外的,有的孩子不打架,有的就是天天打架。在这个地方我们用一个例子来形容下:
在我们生活当中犬又分为导盲犬、搜救犬等等,这个是按照功能来划分的,有的狗没有,有的狗就有。但是他们有一个共性就是都是犬,犬就是一个体系基本的功能,比如有叫,而导盲、搜救这些都属于额外功能,我们用代码来体现下。
abstract class Dog
{ abstract public void houJiao(); } interface DaoMang
{ public void lookWay(); } interface SouJiu
{ public void giveHelp(); } class DaoMangDog extends Dog implements DaoMang
{ public void houJiao()
{ System.out.println("Flow me!"); } public void lookWay()
{ System.out.println("I can give you right way to home"); } } class SouJiuDog extends Dog implements SouJiu
{ public void houJiao()
{ System.out.println("Is someone need Help?"); } public void giveHelp()
{ System.out.println("Ok I can give you a hand"); } } class InterDemo6
{ public static void main(String[] args) { new SouJiuDog().houJiao();
new DaoMangDog().houJiao(); } }
4、异性三:抽象类当中有构造函数还有非抽象方法,可以直接供子类来使用。而接口当中只能存在抽象方法,并且都是公开属性,且有固定的修饰符。
java学习面向对象之接口的更多相关文章
- Java学习---面向对象的远程方法调用[RMI]
基础知识 分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果. 常见的分 ...
- Java 学习笔记(7)——接口与多态
上一篇说了Java面向对象中的继承关系,在继承中说到:调用对象中的成员变量时,根据引用类型来决定调用谁,而调用成员方法时由于多态的存在,具体调用谁的方法需要根据new出来的对象决定,这篇主要描述的是J ...
- java学习面向对象之异常之一
一.异常的概述: 什么是异常?在我们编写java程序的时候,会出现一些问题,比如内存溢出啊或者数组索引超出最大索引啊,这些编程当中出现的这些个问题就是异常.但是异常也分为可以处理的和不可以处理的.比如 ...
- java学习——JDK1.8接口和实现类
Java 8 新特性:接口的静态方法和默认方法 https://blog.csdn.net/sun_promise/article/details/51220518 接口的默认方法和静态方法 http ...
- [Java学习]面向对象-抽象类;接口
抽象类 语法 public abstract class A{ } 定义 抽象类无法实例化.但抽象类有构造方法,在子类创建对象时用. 抽象类中可以定义抽象方法public abstract void ...
- java学习面向对象之匿名内部类
之前我们提到“匿名”这个字眼的时候,是在学习new对象的时候,创建匿名对象的时候用到的,之所以说是匿名,是因为直接创建对象,而没有把这个对象赋值给某个值,才称之为匿名. 匿名对象回顾: class N ...
- java学习面向对象之多态
如何理解多态,让我们举个例子来描述一下,因为单纯的说多态大家可能不理解: abstract class Animal { ; abstract void eat(); public void run( ...
- java学习--面向对象
对象及类的概念 对象是java程序的核心,在java程序中“万事万物皆对象” 对象可以看成是属性和方法的封装体 类是用来创建同一类型的对象的模板,在一个类中定义了该类对象所应具有的属性和方法 J2SD ...
- Java学习 面向对象(下)——Java疯狂讲义th4
面向对象(下) [TOC] 包装类 通过包装类可以把8个基本类型的值包装成对象使用. 自动拆箱.自动装箱 把字符串类型值转换成基本类型的值: 包装类的 parseXxx(String s)静态方法 包 ...
随机推荐
- Linux查看当前系统登录用户、登录日志、登录错误日志
1.查看当前系统的登录用户 w who 2.查看成功登录历史记录 last -n 3.查看尝试登录失败的历史记录 lastb -n 4.显示每个用户最近一次登录成功的信息 lastlog
- python sklearn.linear_model.LinearRegression.score
score(self, X, y, sample_weight=None) 作用:返回该次预测的系数R2 其中R2 =(1-u/v).u=((y_true - y_pred) ** 2).su ...
- PLSQL Developer操作
1.设置 1)下载32位Oracle InstantClient 2)将Oracle InstantClient解压到某目录 3)设置环境变量(修改NLS_LANG和TNS_ADMIN环境变量)对 ...
- android开发:点击缩略图查看大图
android中点击缩略图查看大图的方法一般有两种,一种是想新浪微博list页面那样,弹出一个窗口显示大图(原activity为背景).另一种就是直接打开一个新的activity显示大图. 1.第一种 ...
- ionic 项目分享【转】No.3
写在文章前:由于最近研究ionic框架,深感这块的Demo寥寥可数,而大家又都藏私,堂堂天朝,何时才有百家争鸣之象,开源精神吾辈当仁不让! 原文地址暂时忘记了 ,如果有知道的麻烦在评论处帮忙说一下 , ...
- [原创]ie6,7中td和img之间有间隙
情形描述 开发工具:VS2010: 浏览器版本:IE6以上,火狐,谷歌: 页面布局设计:Table+Img布局: 项目预览问题:火狐,谷歌,IE8以上未出现问题,IE6,IE7图片之间有间隙. 分析原 ...
- rac中 kull session会话脚本
方法:ALTER SYSTEM KILL SESSION '80, 6, @2'; --<= 80 sid,6 serial#,@2 inst_id kill session 脚本如下:sel ...
- vector预分配空间溢出
vector 当一个vector预分配的存储空间用完之后,为维护其连续的对象数组,它必须在另外一个地方重新分配大块新的(更大的)存储空间,并把以前已有的对象拷贝到新的存储空间中去. // A clas ...
- Qt中,当QDockWidget的父窗口是一个不可以拖动的QTabWidget的时候实现拖动的方法
之前在做有关QDockWidget的内容时候遇到了瓶颈,那就是窗口弹出来之后拖动不了,也不可以放大和缩小,若是弹出来之后设置成了window的flags,也不可以拖动,而且也不是需要的效果. 1.弹出 ...
- 选择排序(C++)
选择排序(C++) 选择排序: 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待 ...