接口

使用关键字interface来定义一个接口,和类的定义方法很相似分为接口声明和接口体。

interface  Printable {

final int MAX = 100;

void add();

float sum(float x, float y);

}

接口体中包含常量的声明(没有变量)和抽象方法两部分。而且接口体中所有常量都是publicf访问权限,而且是static常量(允许省略public、final、static修饰符),所有抽象方法一定是pupblic访问权限(允许省略public、abstract等修饰符)。

interface Printable {

final int MAX = 100; //public static final int MAX=100;

void add();      //public abstract void add();

float sum(float x, float y);

}

实现接口

java中接口由类实现以便使用接口的方法。一个类需要在类声明中使用关键字implements声明该类实现一个或多个接口。如果实现多个接口,使用逗号隔开如:

class A implements B,C  //B,C为接口类

如果一个非抽象类实现了某个接口,那么必须重写这个接口中的所有方法。需要注意的是,由于接口中的方法一定是public abstract方法,所以类在重写接口方法时不仅要去掉abstract修饰符、给出方法体,而且访问权限一定要明显的用public来修饰(否则降低了访问权限,这是不允许的)

如果一个类声明实现一个接口,但没有重写接口中的方法,那么这个类必定是抽象类。也就是说抽象类既可以重写接口中的方法,也可以重写接口中的方法。

java提供的接口都在相应的包中,通过import语句不仅可以引用包中的类,也可引入包中的接口,例如:

import java.io.*;

不仅引入了Java.io包中的类,同时也引入了该包中的接口。

接口基础代码:

import java.awt.*;

import java.io.*;

public class Test {

public static void main(String[] args) {

Bus bus101 = new Bus();

Taxi blueTaxi = new Taxi();

Cinema redStarCinema = new Cinema();

MoneyFare fare;

ControlTemperature temperature;

fare = bus101;

bus101.brake();

fare.charge();

fare = blueTaxi;

temperature = blueTaxi;

blueTaxi.brake();

fare.charge();

temperature.controlAirTemperature();

fare = redStarCinema;

temperature = redStarCinema;

fare.charge();

temperature.controlAirTemperature();

}

}

abstract class MotorVehicle {

abstract void brake();

}

interface MoneyFare {

void charge();

}

interface ControlTemperature {

void controlAirTemperature();

}

class Bus extends MotorVehicle implements MoneyFare {

void brake() {

System.out.println("公共汽车使用x刹车");

}

public void charge() {

System.out.println("公共汽车: 一元/张,不计算公里数");

}

}

class Taxi extends MotorVehicle implements MoneyFare, ControlTemperature {

void brake() {

System.out.println("出租车使用盘式刹车技术");

}

public void charge() {

System.out.println("出租车:2元/公里,起价三公里");

}

public void controlAirTemperature() {

System.out.println("出租车安装了Hair空调");

}

}

class Cinema implements MoneyFare, ControlTemperature {

public void charge() {

System.out.print("电影院:门票,十元/张");

}

public void controlAirTemperature() {

System.out.print("电影院安装了中央空调");

}

}

接口参数

如果一个方法的参数是接口类型,我们可以将任何实现该接口的类的实例的引用传递给该接口参数,那么接口参数就可以回调类实现的接口方法。如:

import java.awt.*;

import java.io.*;

interface  SpeakHello {

void speakHello();

}

class Chinese implements SpeakHello {

public void speakHello() {

System.out.println("中国人习惯问候语:你好,吃饭了吗?");

}

}

class English implements  SpeakHello {

public void speakHello() {

System.out.println("英国人习惯性问候语:你好,天气不错 ");

}

}

class KindHello {

public void lookHello(SpeakHello hello) {  //接口回调

hello.speakHello();                 //接口回调参数

}

}

public class Test {

public static void main(String[] args) {

KindHello kindHello = new KindHello();

kindHello.lookHello(new Chinese());

kindHello.lookHello(new English());

}

}

1.接口的定义及简单理解

接口( Interface ):确定了对特定对象所能发出的请求,或者对象接收消息的方式。

将“做什么”与“怎么做”分离;

接口中只声明方法(“做什么”,抽象方法)但不定义方法体(“怎么做”);

接口只规定了类的基本形式,不涉及任何实现细节,实现一个接口的类具有接口规定的行为;

接口可看作使用类的“客户”代码与提供服务的类之间的契约或协议。

2.接口定义=接口声明+接口体

2.1 接口声明

[public] interface 接口名 [extends 父接口列表] { 接口体 }

public / default:任意类均可使用 / 与该接口在同一个包中的类可使用

一个接口可以有多个父接口,子接口继承父接口的所有常量和方法

2.2 接口体

接口体=常量定义+方法定义

常量默认具有public, final, static属性

类型 常量名=常量值;

方法默认具有public, abstract属性

返回类型 方法名 ([参数列表]);

1.常量不能为空白final的

2.父接口中的常量可被子接口中的同名常量隐藏,父接口中的方法可被子接口中的方法重写

3.接口中成员不能使用的修饰符:transient, volatile, synchronized, private, protected

3.接口的使用——用类实现接口

1.类声明中的implements关键字

2.类可以使用接口定义的常量

3.类必须实现接口定义的所有方法

4.一个类可以实现多个接口,例:

interface  I1{ … }

interface  I2{ … }

class  Sup { … }

class C extends Sup implements I1,I2 { … }

5.Java的类继承只支持单继承(子类从单个父类继承),不支持多重继承(子类从多个父类继承)

---extends后的类名只能有一个

---类的继承关系形成树型层次结构

---接口的继承支持多重继承

6.类可以通过实现多个接口达到多重继承的效果

7.在进行单个父类与多个接口合并时,只有单个父类具有实现细节,从而避免代码冲突

8.通过继承扩展接口

---直接向接口中扩展方法可能带来问题:所有实现原来接口的类将因为接口的改变而不能正常工作

---不能向interface定义中随意增加方法,需要通过继承扩展接口,例如:

public interface StockWatcher {

final String sunTicker = "SUNW";

final String oracleTicker = "ORCL";

void valueChanged(String tickerSymbol, double newValue);

void currentValue(String tickerSymbol, double newValue);

}

public interface StockTracker extends StockWatcher {

void currentValue(String tickerSymbol, double newValue);

}

类实现接口

在Java语言中,接口由类来实现以便使用接口中的方法。 一个类需要类声明中使用关键字implements声明该类实现个或多个接口。 如果实现多个接口,用逗号隔开接口名,例如A类实现Pintable和Addable接口。

classA implements Printable,Addable

再如,Animal 的Dog子类实现Eatable和Sleepable接口。

classDog extends Aninal implements Eatable,Sleepable

 重写接口中的方法

如果一个非抽象类实现了某个接口,那么这个类必须重写这个接口中的所有方法。需要注意的是,由于接口中的方法定是public abstract 方法,所以类在重写接口方法时不仅要去掉abstract 修饰符、给出方法体,而且方法的访问权限一定要明显地用public来修饰(否则就降低了访问权限,这是不允许的).实现接口的非抽象类实现了该接口中的方法,即给出了方法的具体行为功能。用户也可以自定义接口,一个Java源文件可以由类和接口组成。

下面的例子1中包含China类、Japan类和Compuable接口,而且China类和Japan类都实现了Computable接口。

Computable.java

public interface Computable{

int MAX=46;

int f(int x);

}

China.java

class China implements Computable{ //China类实现Computable接口

int number;

public int f(int x){       //不要忘记publie关键宇

int sum=0;

for(int i=0;i<=x;i++){

sum=sum+i;

}

return  sum;

}

}

Japan.java

class Japan implements Computable { //Japan 类实现Computable接口

int number;

public int f(int x){

return MAX+x; //直接使用接口中的常量

}

}

Example6_1.java

public class Example6_1{

public static void main(String args[]){

China zhang;

Japan henlu;

zhang=new China();

henlu=new Japan();

zhang.number=32+Computable .MAX; //用接口名访问接口的常量

henlu.number=14+Computable.MAX;

System.out.println("zhang的学号"+zhang.number+",zhang 求和结果"+zhang.f(100));

System.out.println("henlu的学号"+henlu.number+",henlu 求和结果"+henlu.f(100));

}

}

如果一个类声明实现一个接口,但没有重写接口中的所有方法,那么这个类必须是抽象类,也就是说,抽象类既可以重写接口中的方法,也可以直接拥有接口中的方法,例如:

interface Computable {

final int MAX = 100;

vo1d speak(String s);

int f(int x);

float g(float x,float y);

}

abstract classA implements Computable{

public int f(int x){

int sum 0:

for(int i=1;i<=x;i++) {

sum=sum+i;

}

return sum;

}

}

接口的细节说明

程序可以用接口名方问接口中的常量,但是如果个类实现了接口,那么该类可以直接在类体中使用该接口中的常量。

定义接口时,如果关键字interface前面加上外汇返佣public关键字,就称这样的接口是一个public接口。public接口可以被任何一个类实现。如果一个接口不加public修饰,就称作友好接口,友好接口可以被与该接口在同一包中的类实现。

如果父类实现了某个接口,那么子类也就自然实现了该接口,子类不必再显式地使用关键字implements声明实现这个接口,

接口也可以被继承,即可以通过关键字extends声明个接口是另个接口的 子接口。由于接口中的方法和常量都是public的,子接口将继承父接口中的全部方法和常量。

注: Java提供的接口都在相应的包中,通过import语向不仅可以引入包中的类,也可以引入包中的接口,例如:

importJava.io.*;

不仅引入了java.io包中的类,同时也引入了该包中的接口。

Java中的接口是怎么实现的的更多相关文章

  1. JAVA中限制接口流量、并发的方法

    JAVA中限制接口流量可以通过Guava的RateLimiter类或者JDK自带的Semaphore类来实现,两者有点类似,但是也有区别,要根据实际情况使用.简单来说, RateLimiter类是控制 ...

  2. java中List接口的实现类 ArrayList,LinkedList,Vector 的区别 list实现类源码分析

    java面试中经常被问到list常用的类以及内部实现机制,平时开发也经常用到list集合类,因此做一个源码级别的分析和比较之间的差异. 首先看一下List接口的的继承关系: list接口继承Colle ...

  3. 第五节:详细讲解Java中的接口与继承

    前言 大家好,给大家带来详细讲解Java中的接口与继承的概述,希望你们喜欢 什么是接口(interface) 接口中的方法都是抽象方法,public权限,全是抽象函数,不能生成对象 interface ...

  4. java中map接口hashMap以及Enty之间的用法和关系

    java中map接口hashMap以及Enty之间的转换 首先说的是map接口: Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value ...

  5. Java学习笔记二十八:Java中的接口

    Java中的接口 一:Java的接口: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承 ...

  6. Java 中的接口有什么作用?以及接口和其实现类的关系?

    Java 中的接口有什么作用? - Ivony的回答 - 知乎 https://www.zhihu.com/question/20111251/answer/16585393 这是一个初学者非常常见的 ...

  7. java中的接口interface

    关于接口 接口描述了实现了它的类拥有什么功能.因为Java是强类型的,所以有些操作必须用接口去约束和标记.接口作为类的能力的证明,它表明了实现了接口的类能做什么. 类似与class,interface ...

  8. Java中的接口

    1.接口概念 <1>接口可以理解一种特殊的类,由全局常量和公共的抽象方法所组成 <2>类是一种具体实现体,而接口定义了某一批类所需要遵守的规范,接口不必关心这些类的内部数据,也 ...

  9. java中set接口的用法

    java中的set接口有如下的特点: 不允许出现重复元素: 集合中的元素位置无顺序: 有且只有一个值为null的元素. 因为java中的set接口模仿了数学上的set抽象,所以,对应的数学上set的特 ...

  10. 理解Java中的接口

    一.为什么要使用接口 假如有一个需求:要求实现防盗门的功能.门有"开"和"关"的功能,锁有"上锁"和"开锁"的功能. 分 ...

随机推荐

  1. 牛客多校第六场-H-Pair

    链接:https://ac.nowcoder.com/acm/contest/887/H来源:牛客网 题目描述 Given three integers A, B, C. Count the numb ...

  2. MySQL关闭查询缓存(QC)的两种方法

    MySQL Query Cache 会缓存select 查询,安装时默认是开启的,但是如果对表进行INSERT, UPDATE, DELETE, TRUNCATE, ALTER TABLE, DROP ...

  3. express 路由能力

    demo var express=require("express"); var app=express(); app.get("/",function(req ...

  4. Qt 【Qlistview + delegate 为item重写个关闭按钮】

    效果图是这样的. 实现的过程是listview + delegate 本身我想是用listwidget + delegate[网上查询到不可实现] 之前也试过在item中添加布局跟控件,但是在点击的时 ...

  5. String的static方法

    //String concat(String str) 拼接字符串 String concat_str0 = "abc"; String concat_str1 = "b ...

  6. Kotlin学习笔记

    Kotlin的注释 Kotlin 的代码注释和Java一模一样 Kotlin的运行方式也是先kotlinc生成字节码,再kotlin字节码 如果一行里面只有一条语句,那么可以不写分号.但如果打算在同一 ...

  7. C循环

    C 循环 有的时候,可能需要多次执行同一块代码.一般情况下,语句是顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推. 编程语言提供了允许更为复杂的执行路径的多种控制结构. 循环语句允许 ...

  8. ios移动输入框被软键盘遮挡

    页面输入框会出现被软键盘挡住的问题: 解决方法:获取input点击事件设置body高度 $('input').bind('click',function(e){ var $this = $(this) ...

  9. Java简单从文件读取和输出

    Java简单从文件读取和输出 用Scanner输入,用PrintStream输出 功能:从in.txt读入,输出到out.txt 代码: package ioTest; import java.io. ...

  10. Java-Class-@I:io.swagger.annotation.Api

    ylbtech-Java-Class-@I:io.swagger.annotation.Api 1.返回顶部   2.返回顶部 1. package com.ylbtech.api.controlle ...