接口:



我们知道抽象类中能够定义抽象方法,也能够定义非抽象方法。当一个抽象类中的方法都是抽象方法的时候,我们就能够定义还有一种表现方式:接口(interface),所以接口是一种特殊的抽象类



接口的出现将“多继承”通过还有一种形式表示出来,即“多实现”。

注意:接口的定义不是class,而是interface,当然最后编译时还是class文件

interface Demo
{
abstract void show();
abstract void show1(); }

接口中常见的成员:(所有是固定的修饰符)



1.全局常量(public static final)

2.抽象方法(public abstract)

3.当然还有别的

interface Demo
{
public static final int num = 4;//num终身为4
public int num = 4;//不写。会自己主动加上去,默认的,最好写上。否则阅读性差
public abstract void show();
}

由此得出结论:接口里的成员是公共的,->权限最大



假设是类的话。会用继承。假设用接口的话。就不用继承了。用第二种更加直观的表述方式。叫实现(implements)。



为什么叫实现?

接口里的方法都是抽象的,所以必要要全实现,对于抽象类里,有一些不是抽象的。子类拿过来直接用的。继承能够拿过来一些我不须要做,直接能够用的东西,而实现是我所有都要用的。都要覆盖,都要自己重写。



所以:类与类之间是继承关系,类与接口之间是实现关系



接口实现的特点:

import java.util.Scanner;

interface Demo
{
public abstract void show();
public abstract void show1();
public static final int num = 4;
}
//类与类是继承关系。类与接口之间是实现关系(implements)
/*
* 接口不能够实例化
* 仅仅能由实现了接口的子类,而且覆盖了接口中全部的抽象方法后才干够实例化
* 否则,这个子类仅仅是一个抽象类
* */
class Demo1_Imple implements Demo
//一个类实现接口后,必须覆盖接口里全部的方法,才干实现类implements接口
{
public void show()
{
System.out.println("show打印"+num);
}
public void show1()
{
System.out.println("show1打印"+num);
}
}
public class Main
{
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
Demo1_Imple BLF = new Demo1_Imple();
BLF.show();
BLF.show1();
BLF.num = 5;//错误。num是final修饰的
System.out.println(BLF.num);//对象用num
System.out.println(Demo.num);//接口的静态成员
System.out.println(Demo1_Imple.num);//实现接口的子类的静态成员num
}
}

接口的长处:



java不直接支持多继承,由于会出现调用的不确定性(存在隐患),所以java将C++的多继承机制,进行了改良,在java中变成了多实现(一个类实现多个接口)



多继承:同是继承一个或两个父类,一个父类有A,B两功能,一个父类有C,D两个功能,子类一继承就具备A,B,C,D四个功能

多实现:一个父类有A,B两抽象功能,一个父类有C,D两个抽象功能。一个子类实现就具备这4个功能

(与多继承的小差别)

我们注重的是事物的功能。至于功能该怎么用,由子类明白,假设父类的功能已经符合子类的需求。子类直接用就能够了。假设不符合,子类还是具备这个功能。可是要重写,可是功能干什么,子类说的算



为什么java的多实现称为改良的多继承?



多继承的弊端就是假设两个的父类的方法名同样,就会出现不确定性。而多实现呢?就不存在了,由于show()的方法体是子类自己写的,而多继承,继承的是方法体。java改良后,没有方法体,方法体是子类决定的

多实现。小练习:

interface A
{
public abstract void show();
}
interface B
{
public abstract void show();
public abstract int add(int a,int b);
}
class C implements A,B
{
public void show()
{
System.out.println("你好");
}
public int add(int a,int b)
{
return a+b+10;
}
} public class Main
{
public static void main(String[] args)
{
C BLF = new C();
BLF.show();
System.out.println(BLF.add(1, 3));
}
}

故:多实现,对多继承实现了改良



当然,下面两种test的代码方式,是java不能忍受的

interface A
{
public abstract void show();
}
interface B
{
public abstract int show();
}
Test 1:
class C implements A,B
{
public void show()//假设这样写的C还是一个抽象类。由于没有覆盖所以的方法
{
System.out.println("你好");
}
}
Test 2: class C implements A,B
{
public void show()
{
System.out.println("你好");
} public int show()
{
System.out.println("你好,世界");//C中已经定义了show,调用show,返回值确定不了。int还是void
} }

当然,接口的功能。远不于仅仅如此



一个类在继承,还有一个类在多实现(也就是先给该类找一个父类,然后在扩展这些功能)



见代码:

interface A
{
public abstract void show();
}
interface B
{
public abstract void show();
public abstract int add(int a,int b);
}
class D
{
public void print()
{
System.out.println("你好好");
}
}
//非常猛!! !
class E extends D implements A,B//E继承了D,实现了A和B,这样E的功能就丰富多了
{
//E单继承了D中的print功能,可是还想用A,B中的功能,可是这些功能无发通过继承了,
//那么就同一时候实现接口的方式,来扩展E中的功能
public void show()
{
System.out.println("你好");
}
public int add(int a,int b)
{
return a+b+10;
}
public void test()
{
System.out.println("測试");
}
}
/*
* 接口的出现,避免了单继承的局限性*/
public class Main
{
public static void main(String[] args)
{
E BLF = new E();
BLF.show();
System.out.println(BLF.add(1, 3));
BLF.test();
BLF.print();
}
}

类与类之间是继承关系。类与接口之间是实现关系。接口与接口之间呢?



java不支持多继承的原因,就在于方法体



interface A
{
public abstract void show();
}
interface B
{
public abstract void show();
public abstract int add(int a,int b);
} interface E extends A,B//继承关系。且能够多继承,更猛! !。
{
//多继承。差就差在方法体上,接口没方法体,所以能够多继承
public abstract void test(); }
class G implements E
{
public void show()
{
System.out.println("你好好啊");
}
public int add(int a,int b)
{
return 250;
} public void test()
{
System.out.println("你不好");
} }
public class Main
{
public static void main(String[] args)
{ G BLF = new G();
System.out.println(BLF.add(3, 4));
BLF.show();
}
}

哥们仅仅能说,java真的特别猛!!。

以上为接口的基本实现。。



接口的特点:



接口是对外暴露的规则

接口是程序的功能扩展

接口的出现减少耦合性

接口能够用来多实现

类和接口是实现关系,而且类能够继承一个类同一时候实现多个接口

接口与接口是继承关系



接口的概念很大,凡是对外暴露的内容都是接口,比方电脑的USB插口,来连接鼠标。规则是仅仅能连接USB鼠标。

耦合性:能够理解为紧密相联,减少耦合性就是减少了两者紧密相连的程度。比方早期的笔记本电脑,电脑和鼠标是相连的,非常不方便,而USB接口的出现。使非常多不同的鼠标都能够连接电脑。仅仅要这个鼠标是USB的(即符合USB这个规则)。这就叫减少了电脑和鼠标的耦合性,同一时候呢,USB还能够插U盘。这就体现了功能的扩展。

接口和抽象类的差别:



共性:都是不断向上抽取出来的抽象的概念

差别:



1.抽象类体现继承关系。一个类仅仅能但继承

  接口是实现关系,一个接口能够多实现



2.抽象类是继承,是“A  is a  B”,(A是一种B)。定义体系的基本共性内容(我今年上大二。我就是一个大二的学生)

  接口是实现,是“A like a  B”,A类似于B,定义体系的额外的功能 (大二学生。基本功能是学习,有的会抽烟,有的不会,会抽烟的属于大二学生这个体系,抽烟是他具备的额外功能)



3.抽象类中能够定义抽象的,还能够定义非抽象的,供子类直接使用其非抽象方法

  接口,必须全是定义抽象的,其方法子类必须自己实现,并且其内成员还必须是固定的修饰符

abstract 犬
{
public static vois 叫();
}
interface 导盲 //导盲的方式可能不一样,导盲是犬的额外功能。所以定义接口
{// 导盲 为什么不定义类?无法多继承。
//又有疑问为什么犬不定义为接口?
//犬中可能存在一些同样的共性,全部犬科都是一样的,那么这些共性内容。就不是必需定义
//为抽象方法了,定义为一般方法就能够了。而这些接口是实现不了的
public static void 导盲();
}
class 导盲犬 extends 犬 implements 导盲//这里甚至能够多实现
{
public void 叫()
{ }
public void 导盲()//导盲嘛,不一定就是犬,猪,猫,训练好,也能导盲
{ //那么导盲就是一个共性内容->抽取
//可能会想大不了每一个类里(导盲犬、猫。猪),都写导盲这种方法,何必抽取?
//这样想:导盲犬上,导盲猫上,导盲猪上。这样好,还是具备导盲功能的都上好
//答案不言而喻
}
}

所以,在不同的问题领域,有不同的分析方式,不要固化思维方式



接口的应用:



/*

 * 笔记本电脑的使用

 * 为了扩展笔记本电脑的功能。可是怎样会用到什么功能不知道

 * 所以。定义一个规则,仅仅要满足这个规则,那么笔记本就能够具备这个功能

 * 这个规则呢。就是USB接口,鼠标、键盘、视频都能够用,仅仅有满足USB规则

 * 这个规则在java中就是interface*/

interface USB//暴露的规则
{
public abstract void open();//开启
public abstract void close();//关闭
}
class Mouse implements USB//实现规则
{
public void open()
{
System.out.println("Mouse open");
}
public void close()
{
System.out.println("Mouse close");
}
}
class Upan implements USB
{
public void open()
{
System.out.println("Upan open");
}
public void close()
{
System.out.println("Upan close");
}
}
//这些设备和电脑的耦合性就减少了
public class Main
{
public static void main(String[] args)
{
UseUsb(new Upan());//功能扩展
UseUsb(new Mouse());
}
//使用规则
public static void UseUsb(USB a)//接口型引用,用于接受接口的子类的对象
{
a.open();
a.close();
}
}

JAVA学习第十四课(接口:implements及其基本应用)的更多相关文章

  1. JAVA学习第二十五课(多线程(四))- 单例设计模式涉及的多线程问题

    一.多线程下的单例设计模式 利用双重推断的形式解决懒汉式的安全问题和效率问题 //饿汉式 /*class Single { private static final Single t = new Si ...

  2. JAVA学习第二十九课(经常使用对象API)- String类

    多线程告一段落,開始经常使用对象API的涉及,背也要背下来!.! 日后开发,遇见最多的对象是文字,也就是字符串 String类 字符串是一个特殊对象 字符串一旦初始化就不能够被改变 一.特点 publ ...

  3. Java学习笔记十四:如何定义Java中的类以及使用对象的属性

    如何定义Java中的类以及使用对象的属性 一:类的重要性: 所有Java程序都以类class为组织单元: 二:什么是类: 类是模子,确定对象将会拥有的特征(属性)和行为(方法): 三:类的组成: 属性 ...

  4. Java学习第二十四天

    1:多线程(理解) (1)JDK5以后的针对线程的锁定操作和释放操作 Lock锁 (2)死锁问题的描述和代码体现 (3)生产者和消费者多线程体现(线程间通信问题) 以学生作为资源来实现的 资源类:St ...

  5. JAVA学习第二十六课(多线程(五))- 多线程间的通信问题

    一.线程间的通信 实例代码: 需求是:输入一个姓名和性别后,就输出一个姓名和性别 class Resource { String name; String sex ; } class Input im ...

  6. JAVA学习第十九课(java程序的异常处理 (二))

    异常处理的捕捉形式: 这是能够对异常进行针对性处理的方式 六.try.catch的理解 详细格式: try { //须要被检測异常的代码 } catch(异常类 变量)//改变量用于接受发生异常的对象 ...

  7. Python学习第十四课——面向对象基本思想part1

    面向对象的基本思想 # 写法1 person1 = { 'name': 'hanhan', ', 'sex': '男' } def xue_xi(person): print('%s在学习' % pe ...

  8. Java学习(十四)

    玩云顶连跪一晚上,搞得心态有点崩了... 源计划5-4还是一星vn,吐了. 今天学习了伪元素: 语法是 :first-letter//元素的第一个字母的位置,如果:前不加元素,默认是#(即所有元素) ...

  9. java学习第十四天

    1:正则表达式(理解) (1)就是符合一定规则的字符串 (2)常见规则 A:字符 x 字符 x.举例:'a'表示字符a \\ 反斜线字符. \n 新行(换行)符 ('\u000A') \r 回车符 ( ...

随机推荐

  1. Nginx概述与安装

    什么是Nginx 一款服务器软件,类似于Apache.Tomcat Nginx还是一款HTTP和反向代理服务器,同时也是一个代理邮件服务器.除了实现网站发布的功能外,还可以提供负载均衡. 所谓负载均衡 ...

  2. 【bzoj4127】Abs 树链剖分+线段树

    题目描述 给定一棵树,设计数据结构支持以下操作 1 u v d 表示将路径 (u,v) 加d 2 u v 表示询问路径 (u,v) 上点权绝对值的和 输入 第一行两个整数n和m,表示结点个数和操作数 ...

  3. P2846 [USACO08NOV]光开关Light Switching

    题目描述 Farmer John tries to keep the cows sharp by letting them play with intellectual toys. One of th ...

  4. ZOJ 3780 Paint the Grid Again(隐式图拓扑排序)

    Paint the Grid Again Time Limit: 2 Seconds      Memory Limit: 65536 KB Leo has a grid with N × N cel ...

  5. POJ3207 Ikki's Story IV - Panda's Trick 【2-sat】

    题目 liympanda, one of Ikki's friend, likes playing games with Ikki. Today after minesweeping with Ikk ...

  6. Gym 100989F 水&愚&vector

    standard input/output You must have heard about Agent Mahone! Dr. Ibrahim hired him to catch the che ...

  7. IX Samara Regional Intercollegiate Programming Contest F 三分

    F. Two Points time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  8. vuemock数据

    http://www.jianshu.com/p/ccd53488a61b dev.server.js 61 行 app.use('/mock',express.static('./mock'))

  9. webpack-dev-server 支持其他设备访问配置

    webpack-dev-server 打开的服务默认是只能localhost访问的,当有时候需要让别人访问的时候可以配置 --host 192.168.84 这样在同一个局域网下面就可以通过该ip来访 ...

  10. Vijos[1028]魔族密码

    风之子刚走进他的考场,就……花花:当当当当~~偶是魅力女皇——花花!!^^(华丽出场,礼炮,鲜花)风之子:我呕……(杀死人的眼神)快说题目!否则……-_-###花花:……咦~~好冷~~我们现在要解决的 ...