使用接口的核心原因:为了向上转型为多个基类型,以及由此带来的灵活。


package thinkingInJava.interfaces;

//: interfaces/Adventure.java
//Multiple interfaces.
/*
* 本例子展示就是使用接口的核心原因:为了向上转型为多个基类型,以及由此带来的灵活。
* */
interface CanFight {
void fight();
}

interface CanSwim {
void swim();

void fight();//故意放进一个和接口CanFight相同的方法
}

interface CanFly {
void fly();
}

class ActionCharacter {
public void fight() {//故意写一个和接口CanFight,CanSwim相同的方法
System.out.println("----我可以战斗!");
}
}

class Hero extends ActionCharacter implements CanFight, CanSwim, CanFly {
/*
* 在父类、接口中那些相同的方法将具有相同的特征签名
* 也就是说它们方法的交集将指向同一个代表(这个是自己的称呼哈!O(∩_∩)O哈哈~)
*/
public void swim() {
System.out.println("----我可以游泳!");
}

public void fly() {
System.out.println("----我可以飞翔!");
}
}

public class Adventure {

public static void t(CanFight x) {
System.out.println("来自CanFight:");
x.fight();
}

public static void u(CanSwim x) {
System.out.println("来自CanSwim:");
x.swim();
x.fight();
}

public static void v(CanFly x) {
System.out.println("来自CanFly:");
x.fly();
}

public static void w(ActionCharacter x) {
System.out.println("来自ActionCharacter:");
x.fight();
}

public static void main(String[] args) {
/*
* t,u,v,w方法中传递的参数可以向上某个接口或者类
*/
Hero h = new Hero();
t(h); // Treat it as a CanFight,向上某个接口CanFight
u(h); // Treat it as a CanSwim,向上某个接口CanSwim
v(h); // Treat it as a CanFly,向上某个接口CanFly
w(h); // Treat it as an ActionCharacter,向上某个类ActionCharacter
}
} // /:~


运行结果:

来自CanFight:
----我可以战斗!
来自CanSwim:
----我可以游泳!
----我可以战斗!
来自CanFly:
----我可以飞翔!
来自ActionCharacter:
----我可以战斗!



[color=red]对上述代码进行一下优化[/color]

经验来源:在JDK的API文档中我们会经常看见命名的规范和方法的重载,裁图示例!

[color=red]Arrays.fill[/color]
[img]http://dl.iteye.com/upload/picture/pic/77077/be1d761c-c6f0-3eca-b311-b9455b0ad0f5.jpg[/img]
[color=red]Arrays.binarySearch[/color]
[img]http://dl.iteye.com/upload/picture/pic/77075/f74ff6ba-700f-3cad-933b-50c22d8e0636.jpg[/img]




package tij.interfaces.test;


/*
* 参考:package thinkingInJava.interfaces.Adventure.java;
*
* 本例子展示就是使用接口的核心原因:为了向上转型为多个基类型,以及由此带来的灵活。
* */
interface CanFight {
void fight();
}

interface CanSwim {
void swim();

void fight();// 故意放进一个和接口CanFight相同的方法
}

interface CanFly {
void fly();
}

class ActionCharacter {
public void fight() {// 故意写一个和接口CanFight,CanSwim相同的方法
System.out.println("----我可以战斗!");
}
}

class Hero extends ActionCharacter implements CanFight, CanSwim, CanFly {
/*
* 在父类、接口中那些相同的方法将具有相同的特征签名 也就是说它们方法的交集将指向同一个代表(这个是自己的称呼哈!O(∩_∩)O哈哈~)
*/
public void swim() {
System.out.println("----我可以游泳!");
}

public void fly() {
System.out.println("----我可以飞翔!");
}
}

public class Adventure {
/*
* 在这里重载了方法getPath:传递的参数不同,方便统一个调用名称
*/

public static void getPath(CanFight x) {
System.out.println("来自CanFight:");
x.fight();
}

public static void getPath(CanSwim x) {
System.out.println("来自CanSwim:");
x.swim();
x.fight();
}

public static void getPath(CanFly x) {
System.out.println("来自CanFly:");
x.fly();
}

public static void getPath(ActionCharacter x) {
System.out.println("来自ActionCharacter:");
x.fight();
}

public static void main(String[] args) {
/*
* 我们只需使用Hero类的上级来指向对象
* 这种方法也是非常实用的方式
*/
CanFight cf = new Hero();
getPath(cf);

CanSwim cs = new Hero();
getPath(cs);

CanFly cfly = new Hero();
getPath(cfly);

ActionCharacter ac = new Hero();
getPath(ac);
}
}




输出的结果和刚才一样:

来自CanFight:
----我可以战斗!
来自CanSwim:
----我可以游泳!
----我可以战斗!
来自CanFly:
----我可以飞翔!
来自ActionCharacter:
----我可以战斗!


.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值