java基础-接口与实现
接口的定义和类的定义很相似,可以分为接口声明和接口体积,和类不同的是,使用关键字interface来声明自己是一个接口。
格式如下;
interface 接口的名字
这里需要注意的是:
1、如果一个非抽象类实现了某个接口,那么这个类必须重写这个接口中的所有方法。
2、如果一个类声明实现一个接口,但是没有重写接口中的从所有方法,那么这个类必须是抽象类,也就是说抽象类既可以重写接口中的方法,也可以直接拥有接口中的方法。
3、程序可以用接口名访问接口中的常量,但是如果一个类实现了接口,那么该类可以直接在类体中使用该接口的常量。
4、在我们定义接口的时候,如果关键字interface 前面加一个public关键字,就成这样的接口是一个public接口,public接口可以被任何一个类实现。如果一个接口不加public修饰。就称作是友好接口,友好接口可以被 与该接口在同一个包中的类实现。
5、如果父类实现了某个接口,那么子类自然也就实现了该接口,子类不必再显式地使用关键字implement声明实现这个接口。
6、接口也可以被继承,即可以通过关键字extends声明一个接口是另外一个接口的子接口。由于接口中的方法和常量都是public的,子接口将继承父接口中的全部方法和常量。
举个例子吧:
在这个例子中China类和Japan类分别继承computable接口。
下面是具体的源代码:
China类
1 package Example14; 2 3 import Example5.ComputerAver; 4 5 public class China exends Computable { 6 int number; 7 public int f(int x) { 8 //public关键字别漏了 9 int sum = 0; 10 for(int i=1; i<= x;i++){ 11 sum+=i; 12 } 13 return sum; 14 } 15 //重写方法f 16 }
Japan类
1 package Example14; 2 3 public class Japan extends Computable { 4 int number; 5 @Override 6 public int f(int x) { 7 return MAX + x; 8 //直接调用接口中的常量 9 } 10 11 }
computable接口
1 package Example14; 2 3 public interface Computable { 4 int MAX = 46; 5 public abstract int f(int x); 6 }
主函数:
1 package Example14; 2 3 public class Demo { 4 5 public static void main(String[] args) { 6 China zhang; 7 Japan henlu; 8 zhang = new China(); 9 henlu = new Japan(); 10 zhang.number = 32 + Computable.MAX; 11 henlu.number = 14 + Computable.MAX; 12 System.out.println("zhang的学号" + zhang.number + " zhang求和结果" + zhang.f(100)); 13 System.out.println("henlu的学号" + henlu.number + " henlu求和结果" + henlu.f(100)); 14 } 15 16 }
运行结果:
zhang的学号78 zhang求和结果5050
henlu的学号60 henlu求和结果146
例子2:
动机类MotorVehicles :
1 package Example15; 2 3 interface MoneyFare { 4 void charge(); 5 }
空调接口ControlTemperature:
1 package Example15; 2 3 interface ControlTemperature { 4 void controlAirTemperature(); 5 }
Bus类继承了动机类并且实现了收费接口
1 package Example15; 2 //bus实现MoneyFare 3 //一个接口 4 5 public class Bus extends MotorVehicles implements MoneyFare{ 6 7 void brake(){ 8 System.out.println("公共汽车使用毂式刹车"); 9 }//重写 10 11 public void charge() { 12 System.out.println("公共汽车:一元/张,不计算公里数"); 13 } 14 15 16 }
Taxi类继承了动机类并且实现了空调和收费接口
1 package Example15; 2 3 public class Taxi extends MotorVehicles implements MoneyFare ,ControlTemperature { 4 5 6 public void charge() { 7 System.out.println("出租车:2元/公里,起价3公里"); 8 } 9 10 11 void brake() { 12 System.out.println("出租车使用盘式刹车技术:"); 13 } 14 15 16 public void controlAirTemperature() { 17 System.out.println("出租车安装了Hair空调"); 18 } 19 20 }
Cinrma 实现了空调和收费接口
1 package Example15; 2 3 public class Cinrma implements MoneyFare, ControlTemperature { 4 5 @Override 6 public void controlAirTemperature() { 7 System.out.println("电影院安装了中央空调"); 8 } 9 10 @Override 11 public void charge() { 12 System.out.println("电影院:门票,10/张"); 13 } 14 15 }
主函数调用
1 package Example15; 2 3 public class Demo { 4 5 public static void main(String[] args) { 6 Bus bus = new Bus(); 7 Taxi taxi = new Taxi(); 8 Cinrma cinrma = new Cinrma(); 9 bus.brake(); 10 bus.charge(); 11 taxi.charge(); 12 taxi.brake(); 13 taxi.controlAirTemperature(); 14 cinrma.charge(); 15 cinrma.controlAirTemperature(); 16 } 17 18 }
调试结果:
公共汽车使用毂式刹车
公共汽车:一元/张,不计算公里数
出租车:2元/公里,起价3公里
出租车使用盘式刹车技术:
出租车安装了Hair空调
电影院:门票,10/张
电影院安装了中央空调
关于接口回调
和类一样,接口也是Java中一种重要的数据类型,用接口声明的变量称作接口变量。
接口属于引用型变量,接口变量中可以存放实现该接口类的实例应引用,即存放对象的引用。
“接口回调”这个词是借用了C语言中的指针回调的术语,表示一个变量的地址在某一个时刻放在一个指针变量中,那么指针变量就可以间接操作该变量中存放的数据。
在Java语言中,接口回调是指:可以把实现某一接口的类创建的对象的引用赋值给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口方法。事实上,当接口变量调用被类实现的接口方法时,就是通知相应的对象调用这个方法。
举个例子:假设Com是一个接口,ImpleCom类是实现Com接口的类
Com com;
ImpleCom impleCom;
com = impleCom;// 这样是合法的。将impleCom 的对象的引用赋值给com接口。
类似上转型对象调用子类重写的方法
下面我们举个例子:
ShowMessage 接口:
package Example16;public interface ShowMessage {void 显示商标(String s);
}
PC类实现了ShowMessage接口
package Example16;public class PC implements ShowMessage {public void 显示商标(String s) {System.out.println(s);}}
TV类实现了ShowMessage 接口:
package Example16;public class TV implements ShowMessage {public void 显示商标(String s) {System.out.println(s);}}
主函数:
package Example16;public class Demo {public static void main(String[] args) {ShowMessage message;message = new TV();message.显示商标("长虹牌电视机");message = new PC();message.显示商标("华硕A550jk4200");}}
调试结果
长虹牌电视机
华硕A550jk4200
关于接口和多态:
接口产生的多态就是指不同的类在实现同一个接口时可能具有不同的实现方法,那么接口变量在回调接口方法是就可能具有多种形态。
下面我们举个例子:
接口ComputerAverage :
package Example17;interface ComputerAverage {public double average(double a,double b);
}
类A实现接口ComputerAverage
package Example17;public class A implements ComputerAverage {public double average(double a, double b) {double aver = 0;aver = (a+b)/2;return aver;}}
类B实现接口ComputerAverage
package Example17;public class B implements ComputerAverage {public double average(double a, double b) {double aver = 0;aver = Math.sqrt(a*b);return aver;}}
主函数调用:
package Example17;public class Demo {public static void main(String[] args) {ComputerAverage average;double a = 11.45,b = 45.45;average = new A();double result = average.average(a, b);System.out.println(a + "和" + b + "的算术平均值:" + result );average = new B();result = average.average(a, b);System.out.println(a + "和" + b + "的几何平均值:" + result );}}
调试结果:
11.45和45.45的算术平均值:28.450000000000003
11.45和45.45的几个平均值:22.81233219116362
在这个例子中类A和类B都实现了ComputerAverage接口,但是实现的方式不同。
关于接口参数:
如果一个方法参数的类型是接口类型,我们就可以将任何实现该接口的类的实例的引用传递给接口参数,那么接口参数就可以回调类实现的接口方法,下面举个例子:
基本接口SpeakHello.java
package Example18;interface SpeakHello {void speakHello();
}
Chinese类实现接口:
package Example18;public class Chinese implements SpeakHello {public void speakHello() {System.out.println("中国人习惯问候语:你好!吃饭了吗?");}}
English类实现接口
package Example18;public class English implements SpeakHello {public void speakHello() {System.out.println("英国人习惯性用语:你好,天气不错!");}}
KindHello类使用接口类型参数,实现接口回调
package Example18;public class KindHello {public void lookHello(SpeakHello hello) {//接口类型参数,接口回调hello.speakHello();}
}
主调用函数:
1 package Example18; 2 3 public class Demo { 4 5 public static void main(String[] args) { 6 KindHello kindHello = new KindHello(); 7 kindHello.lookHello(new Chinese()); 8 kindHello.lookHello(new English()); 9 } 10 11 }
调试结果:
1 中国人习惯问候语:你好!吃饭了吗? 2 英国人习惯性用语:你好,天气不错!
abstract类与接口的比较:
1、abstract类和接口都可以有abstract方法。
2、接口中只可以有常量,不能有变量;而abstract类中既可以有常量也可以有变量。
3、abstract类中也可以有非abstract方法,而接口必须是抽象方法。
需要注意的是:
在设计程序时应当根据具体的方法来确定是使用抽象类还是接口。abstract类除了提供重要的需要子类重写的abstract方法之外,也提供了子类可以继承的变量和非abstract方法。如果某个问题需要使用继承才能更好地解决,比如:子类除了需要重写父类的abstract方法,还需要从父类继承一些变量或者继承一些重要的非abstract方法,就可以考虑使用abstract类。如果某个问题不需要继承,只是需要若干个子类给出某些重要的abstract方法的实现细节,就可以考虑使用接口。
一个面向接口编程的应用举例:
问题的提出:
设计一个广告牌,希望所设计的广告牌可以展示许多公司的广告词。
1、问题的分析:
如果我们设计的创建广告牌的类中是某个具体公司类。(例如联想公司类),声明了对象。那么我们的广告牌就缺少弹性,因为用户一旦需要广告牌展示其他公司的广告词,就需要修改广告牌类的代码,比如用长虹公司声明成员变量。
如果没当用户有了新的需求,就会导致修改类的某部分代码,那么就应当将这部分代码从该类重分割出去,使它和其他稳定的代码之间是松耦合的关系(否则系统缺乏弹性,难以维护),即将每种可能的变化对应地交给实现接口的类(抽象类的子类)去负责完成。
2、设计接口。
根据以上的对问题的分析,首先设计一个接口Advertisement,改接口有2个方法show-Advertisement()和getCorpName();那么实现Advertisement接口的类必须重写,show-Advertisement()和getCropName()方法,及要求各个公司给出具体的广告词和公司的名称。
3、设计广告牌类
然后我们设计AdvertisementBoard类(广告牌),该类有一个show(Advertisement adver)方法,该方法的参数adver是Advertisement接口类型(就像人们常说的,广告牌对外留有接口)。显然,该及参数adver可以存放任何实现Advertisement接口的类的对象的引用,并且回调重写的接口方法ShowAdvertisement()来显示公司的广告词,回调类重写的接口方法getCropName()来显示公司的名称。
下面是具体实现的代码:
广告Advertisement接口:
1 package Example19; 2 /** 3 * 接口 4 * @author 10497 5 * 6 */ 7 public interface Advertisement { 8 public void ShowAdvertisement(); 9 public String getCropName(); 10 }
广告牌类,完成接口回调:
1 package Example19; 2 /** 3 * 广告牌类 4 * @author 10497 5 * 6 */ 7 8 public class AdvertisementBoard { 9 public void Show(Advertisement adver){//使用接口参数 10 System.out.println(adver.getCropName() + "的广告词如下:"); 11 adver.ShowAdvertisement(); 12 //接口回调 13 } 14 }
安踏公司实现接口:
1 package Example19; 2 3 public class AnTaCrop implements Advertisement { 4 5 public void ShowAdvertisement() { 6 System.out.println("@@@@@@@@@@@@@@@@@@@"); 7 System.out.println("安踏,运动永不止步~~"); 8 System.out.println("@@@@@@@@@@@@@@@@@@@"); 9 } 10 11 public String getCropName() { 12 return "安踏有限公司"; 13 } 14 15 }
特步公司实现接口
package Example19;public class TeBuCorp implements Advertisement {public void ShowAdvertisement() {System.out.println("**********************");System.out.println("特步,非一般的感觉~~~~~");System.out.println("**********************");}public String getCropName() {return "特步有限公司";}}
主调用函数:
1 package Example19; 2 3 public class Application { 4 public static void main(String args[]){ 5 AdvertisementBoard board = new AdvertisementBoard(); 6 board.Show(new AnTaCrop()); 7 board.Show(new TeBuCorp()); 8 } 9 }
调试结果:
1 安踏有限公司的广告词如下: 2 @@@@@@@@@@@@@@@@@@@ 3 安踏,运动永不止步~~ 4 @@@@@@@@@@@@@@@@@@@ 5 特步有限公司的广告词如下: 6 ********************** 7 特步,非一般的感觉~~~~~ 8 **********************
转载于:https://www.cnblogs.com/xiaomengyuan/p/9062873.html
java基础-接口与实现相关推荐
- java基础-----接口
接口 : 英文称作interface,在软件工程中,接口泛指供别人调用的方法或者函数.从这里,我们可以体会到Java语言设计者的初衷,它是对行为的抽象.在Java中,定一个接口的形式如下: [publ ...
- [Java 基础]接口
抽象类和抽象方法 抽象方法 在面向对象编程语言中抽象方法指一些只有方法声明而没有具体方法体的方法抽象方法一般存在于抽象类或接口中. java中,抽象方法就是以 abstract 修饰的方法,只需要声明 ...
- Java基础---接口是啥?
接口 接口:是一个特殊的抽象类,规定了接口的使用者和接口的实现者之间的规范 定义:interface 接口名 {} 特点:接口中定义的属性都是公开静态常量(即使不加修饰符,也默认是public sta ...
- Java基础---接口的使用
接口 接口:是一个特殊的抽象类,规定了接口的使用者和接口的实现者之间的规范 定义:interface 接口名 {} 特点:接口中定义的属性都是公开静态常量(即使不加修饰符,也默认是public sta ...
- java基础/接口与继承1(0.96万字)
文章目录 接口 创建接口 使用接口 什么样的情况下该使用接口? 对象转型 明确引用类型与对象类型的概念 子类转父类(向上转型) 父类转子类(向下转型) 总结 没有继承关系的两个类,互相转换,一定会失败 ...
- java基础[接口]
接口作用:将两个不同的东西连接起来,让他们共同去工作! 具体类:定义某一具体的事物: 抽象类:定义某一类不同种的事物: 接口:定义不同类型的不同种事物,但是却有共同的行为,注重事物的行为,而不是事物的 ...
- Java基础——接口
一.接口语法 接口的创建 interface //接口不能直接创建对象 public interface grammar {//定义的属性都是公有静态属性(默认也是)String name = &qu ...
- java基础--接口(interface)
接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法. 接口并不是类,编写接口 ...
- [Java基础]接口基础
接口:
最新文章
- PCA(Principal Component Analysis)的原理、算法步骤和实现。
- 密码学===公钥和私钥解释
- POJ 3580 SuperMemo
- 探究java-JVM的五步(三步)类加载机制(包含类加载过程的一些代码书写,如类加载代码)
- SAP Spartacus 页面标题的更改机制 - 谁动了我的页面标题?
- mysql 魔术设置_PHP之十六个魔术方法详细介绍
- 最受欢迎的资源是高质量的GUI工具包
- 悄悄告诉你,在硅谷,有一种工作比程序员挣得多
- 网页页面禁止用户复制
- 前端零碎问题(四)css3
- 优先级队列之PriorityQueue
- Webrtc之2台电脑视频聊天
- java中动态代理的使用
- CentOS英文环境下使用ibus输入法
- MySQL计算两个日期相差的天数、月数、年数
- lldp协议代码阅读_LLDP - 小蚂蚁_CYJ - 博客园
- Homography和warpPerspective
- Ccharles 爬取微信公众号和小程序
- FCSAN存储与服务器关联映射 在Linux系统中如何识别操作
- 视频压缩软件,视频压缩软件哪个最好用?
热门文章
- k型热电偶材料_K型热电偶规格参数及使用性质.doc
- Oracle远程创建表空间报错ORA-01119 ORA-27040 OSD-O4OO2
- 一起走过的日子坚守十年
- 计算机多媒体技术第五章,第五章多媒体技术的发展与应用
- 数据库软件MySQL的下载与安装+Navicat for MySQL图形化管理界面的下载与连接
- Android项目之仿360手机助手项目
- 无所适从不是为了颓废
- 【c/c++】银行家算法
- 各种素材网站大全【全部倾倒,福利倒计时-JS,HTML,游戏素材,UI,图片素材等
- springboot 健康饮食