接口:



我们知道抽象类中能够定义抽象方法,也能够定义非抽象方法。当一个抽象类中的方法都是抽象方法的时候,我们就能够定义还有一种表现方式:接口(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. 关于JavaWeb开发的一些感悟

    从事JavaWeb的开发已经三年了,从最开始的啥都不会,到慢慢的能够独立做项目,从一开始的一片茫然,到现在的心中有数.对于技术.业务也有了自己的看法. JavaWeb开发所涉及到的知识点非常多,涉及到 ...

  3. P2412 查单词

    题目背景 滚粗了的HansBug在收拾旧英语书,然而他发现了什么奇妙的东西. 题目描述 udp2.T3如果遇到相同的字符串,输出后面的 蒟蒻HansBug在一本英语书里面找到了一个单词表,包含N个单词 ...

  4. PIC单片机之时钟设置

    PIC单片机之时钟设置 http://blog.csdn.net/superanters/article/details/8541650 内部时钟和外部时钟? PIC单片机有许多型号可以设置成 用外部 ...

  5. pat Public Bike Management (30)

    There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...

  6. 超简单(super)

    超简单(super) 题目描述 有一个n面的骰子,第i面的数是vi,朝上的概率是pi. 教室的最后一排有一个人,不停地抛这个骰子,直到某一面朝上了两次,就停止抛骰子,但他不知道所有朝上的面的数字的和的 ...

  7. pat 团体天梯 L1-046. 整除光棍

    L1-046. 整除光棍 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 翁恺 这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1 ...

  8. spfa代码

    先来贴一下,,虽然不是自己写的 #include<iostream>#include<cstdio>#include<cstring>#include<cma ...

  9. HTTP 错误 401.2 - Unauthorized

    最近开始拾起Asp.net方面的知识,遇到如下这个问题 HTTP 错误 401.2 - Unauthorized 由于身份验证头无效,您无权查看此页. 解决方法: >IIS管理 >功能视图 ...

  10. EL与OGNL

    EL表达式:  >>单纯在jsp页面中出现,是在四个作用域中取值,page,request,session,application. >>如果在struts环境中,它除了有在上 ...