6.Java类的接口
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
通过Java接口,我们同样可以享受到多态性的好处,大大提高了程序的可扩展性及可维 护性
9
【回顾】
• 为我们的打地鼠游戏更换一种新的设计:
– – – – 在一个洞里有三种物体可能出现:企鹅、北极熊(Bear)、炸弹(Bomb) 企鹅和北极熊必须继承于动物类,会吃饭睡觉。 设计一个可打击接口(Beatable),该接口有(beatIt)方法,用来打击该对象 为各种物体实现可打击接口
12
【面向接口编程示例】
• 采用面向接口编程的方式实现,以下是三个步骤中的第一步: 抽象出Java接口
1、分析: 无论动物还是炸弹在被打后都能进行反馈。反馈动作有加分减分和游戏结束 2、结论: 抽象出Java接口Feedback,在其中定义方法good,bad,gameOver 3、具体实现:
控制台输出
play... wash...
5
【为什么需要接口】
• 刘备是汉室宗亲,那么他是继承了汉室血统的官二代,但是他后来又变成了蜀国的皇帝, 他有领导蜀国的职责。
汉室宗亲 蜀国皇帝
坑爹呢这是
6
【为什么需要接口】
• 刘备继承了汉室皇族的血脉,他的本质是汉室宗 亲。这是继承关系 • 刘备是蜀国皇帝,这是他的职责和权力,这是他 的职能。 • 接口就是职能。也就是继承树外的能力
class TV implements Socket { public void power() { System.out.println("play..."); } } class Washer implements Socket { public void power() { System.out.println("wash..."); } } 电视洗衣机都能通过三孔插座供电,但行为完全不同
14
【面向接口编程】
• 采用面向接口编程的方式实现,以下是三个步骤中的第三步: 使用Java接口 1、分析:
主体构架使用接口, 让接口构成系统的骨架 2、结论: 更换实现接口的类就可以更换系统的实现 3、具体实现: public class Penguin implements Beatable{ public void beatIt(Feedback fb) { fb.good(10); } } public class Seal implements Beatable { public void beatIt(Feedback fb) { fb.bad(30); } }
TRAINING COURSE.1
2014-06
面向对象编程基础之接口和抽象
—— 主讲人:唐睿
【章程目标】
Java继承的回顾 接口的概念(what) 为什么要使用接口(why) 如何实现接口(when+how) Java的抽象类和抽象方法 抽象类和抽象方法的定义
【回顾】
• 举例说明在什么样的情况下,需要使用到继承?
控制台输出
一周有8天
19
【为什么是常量】
• 常量是一种标识符,它的值在运行期间恒定不变 • 常量标识符在程序中只能被引用,而不能被重新赋值
常量 圆周率PI
public static final double PI = 3.14159265358979323846;
圆周率PI代码 表示方式
将ang角度转换成径度 用法
public static double toRadians(double ang) { return ang / 180.0 * PI; }
20
【常量的优点】
• 如果不使用常量,直接在程序中填写数字或字符串,将会有什么麻烦?
public static double toRadians(double ang) { return ang / 180.0 * 3.14159265358979323846; } public static double toDegrees(double ang) { return ang * 180.0 / 3.14159265358979323846; } public static final double PI = 3.14159265358979323846; // 圆周率 public static double toRadians(double ang) { return ang / 180.0 * PI; } public static double toDegrees(double ang) { return ang * 180.0 / PI; } 使用常量可以增强程序的可读性、可维护性 程序的可读性变差:用户很难理 解数字或字符串的意思
7
【为什么需要接口】
曹操是汉贼,但是他是魏国皇帝
曹操、刘备都存在一个共同的身份:皇帝,他们当皇帝方法有各自不同的实 现,但是他们同样都对国家做了“治理”的动作。
当皇帝 定义一个Java接口,在其中定义"治理"方法, 但没有具体实现
• 刘备、曹操属于两种不同的家族(基类不同),无法通过“is-a”找到一个合适的父类( 家族)
Beatable
Penguin (企鹅)
Boom (炸弹)
11
【面向接口编程示例】
演示实现:升级上述的打地鼠游戏,要求如下:
添加一个动物和炸弹被打后的反馈 反馈有三种动作:加分、减分、游戏结束 游戏主控类需Hale Waihona Puke Baidu根据反馈对游戏进行控制 设计三种可打对象——企鹅、海豹、炸弹,并实现其Beatable接口 设计反馈接口,反馈的效果是:打一下企鹅+10分,打一下海豹-10分,打一下炸弹游 戏结束。 • 系统要具备良好的可扩展性与可维护性 • • • • •
控制台输出
一周有7天
• 然而,你可能不会意识到事情正在悄悄改变:
public class Week { private int days = 7; public static void main(String[] args) { Week w = new Week(); w.days ++; System.out.println("一周有"+w.days+"天"); } } 如何保证变量的值在运行期无法被改变?——使用常量
曹操
刘备
各自当皇帝有各自的方法
8
【为什么需要接口】
这时候,应该怎样实现刘备和曹操这样的情况呢?
public interface Emperor { public void manage(String country); }
public class Liubei extends Hanshi implements Emperor{ public void manage(String country) { getZhugeliang().manage(country); } }
【小结】
阅读如下Java代码,然后请采用面向接口编程的思想,在空白 处填写正确的代码
public interface PCI { void start(); void stop(); } class SoundCard implements PCI{ public void start() { System.out.println("Du du..."); } public void stop() { System.out.println("Sound stop!"); } } 这是Java接口,相当于主板上的PCI插 槽的规范
18
PCI
提示:通过这个方法,主板上可以插入任 意符合PCI插槽规范的卡
提示:可以通过更换实现接口的类来更换系统 的实现
【常量】
• 生活中,一周有七天,如何用代码表示?
public class Week { private int days = 7; public static void main(String[] args) { Week w = new Week(); System.out.println("一周有"+w.days+"天"); } }
public interface Feadback { public void good(int price); public void bad(int price); public void gameOver(); }
13
【面向接口编程示例】
• 采用面向接口编程的方式实现,以下是三个步骤中的第二步: 实现Java接口 1、分析:
17
声卡、网卡都实现了PCI插槽的规范,但行为完全不同
【小结】
public class MainBoard{ public void usePCICard(______ p) { p.start(); p.stop(); } } public class Assembler { public static void main(String[] args) { MainBoard mb=new MainBoard(); //在主板上插入网卡 PCI nc=new NetworkCard(); mb.usePCICard(nc); //在主板上插入声卡 PCI sc=new SoundCard(); mb.usePCICard(sc); } }
• 编写测试类BeatItTest进行测试,要求:
– 不时从不同位置出现各种东西。输入位置来打它们。
10
【面向接口编程】
• 开发系统时,主体构架使用接口,接口构成系统的骨架 • 这样就可以通过更换接口的实现类来更换系统的实现
public class Boom implements Beatable { public void beatIt() { System.out.println("爆炸"); } } public class Penguin extends Animal implements Beatable { public void beatIt() { System.out.println("哇"); } } Beatable b1 = new Boom(); Beatable b2 = new Penguin(); b1.beatIt(); b2.beatIt();
4
【什么是接口】
• 可以使用Java接口标识类型 • 运行时,根据实际创建的对象类型调用相应的方法实现
public class Assembler { public static void main(String[] args) { tv = new TV(); 1 Socket Socket wa = new Washer(); tv.power(); 2 wa.power(); } }
已经抽象出Java接口Feedback,并在游戏控制里添加对反馈的处理 2、结论: 游戏控制类实现Feedback接口,实现good,bad,gameOver方法 3、具体实现: public class BeatItGameMain implements Feedback { private int price; public void good(int price) { this.price+=price; } public void bad(int price) { this.price-=price; } //gameOver实现... }
15
【接口的继承】
• 接口可以继承,必须实现接口继承树上的所有接口方法,可以在继 承树上对接口继承使用多态
public interface Socket2 { void power2(); } public interface Socket3 extends Socket2{ void power3(); } public class TV implements Socket3 { @Override public void power2() { } @Override public void power3() { } }
class NetworkCard implements PCI{ public void start() { System.out.println("Send..."); } public void stop() { System.out.println("Network stop!"); } }
public class Caocao extends Traitor implements Emperor { public void manage(String country){ this.manage(country); } }
Emperor liu = new Liubei(); Emperor cao = new Caocao(); liu.manage("蜀国"); cao.manage("魏国");
• 在Java程序中,多态性带给我们的好处是什么?
3
【什么是的接口】
• 一个Java接口是一些方法特征的集合,但没有方法的实现
public interface Socket { public void power(); } 这是Java接口,相当于三孔插座
• Java接口中定义的方法在不同的地方被实现,可以具有完全不同的行为