A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

我定义了两个接口Programmer,BizAgent,两个类:一个是SoftEngineer类工程师类,一个Test测试类
工程师类SfotEngineer实现了接口Programmer,BizAgent,
测试类Test中有一条BizAgent bizAgent=(BizAgent)programmer;这不是表明一个接口能强制转化成另一个接口吗?但两个接口没有继承关系啊,它们属于平等的关系,怎么能强制转换呢?百思不得其解,请高手解惑!详细代码如下:

/**
* 人接口
* @author Administrator
*
*/
public interface Person {
/**
* 返回人的姓名
* @return 姓名
*/
public String getName();
}
/**
*Programmer接口
*/
public interface Programmer extends Person {
/**
* 写程序代码。
*/
public void writeProgram();
}
/**
*BizAgent 接口
*/
public interface BizAgent extends Person{
/**
* 讲解业务
*/
public void giveBizSpeech();
}
/**
*软件工程师类
*/
public class SoftEngineer implements Programmer,BizAgent{
private String name;//软件工程师姓名
public SoftEngineer(String name){
this.name=name;
}
public String getName(){
return name;
}

public void giveBizSpeech(){
System.out.println("我会讲业务。");
}
public void writeProgram(){
System.out.println("我会写代码。");
}
}
/**
*测试类
*/
public class Test {
public static void main(String[] args) {
Programmer programmer=new SoftEngineer("小明");
System.out.println("我是一名软件工程师,我的名字叫"+programmer.getNam()+". ");
programmer.writeProgram();
BizAgent bizAgent=(BizAgent)programmer;
bizAgent.giveBizSpeech();
}

}

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

2 个回复

倒序浏览
本帖最后由 原满 于 2013-5-2 22:29 编辑

SoftEngineer implements Programmer,BizAgent    说明SoftEngineer 既实现了 Programmer接口  又实现了BizAgent 接口
public class Test {
public static void main(String[] args) {
Programmer programmer=new SoftEngineer("小明");
System.out.println("我是一名软件工程师,我的名字叫"+programmer.getNam()+". ");
System.out.println(programmer instanceof BizAgent); //在测试代码中加上这一行,其结果返回true  说明 programmer是BizAgent的实例
programmer.writeProgram();
BizAgent bizAgent=(BizAgent)programmer;              //所以这里就可以将programmer对象强制转换成 BizAgent
bizAgent.giveBizSpeech();
}

如果把 BizAgent与Person接口之间的继承关系去掉 结果也一样
也就是说之所以能强制转换 跟BizAgent 与 Programmer接口之间的关系没什么关系,只是因为它同时实现了两个接口

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报

  1. /**
  2. * 人接口
  3. * @author Administrator
  4. *
  5. */
  6. interface Person {
  7. /**
  8. * 返回人的姓名
  9. * @return 姓名
  10. */
  11. public String getName();
  12. }
  13. /**
  14. *Programmer接口
  15. */
  16. interface Programmer extends Person {
  17. /**
  18. * 写程序代码。
  19. */
  20. public void writeProgram();
  21. }
  22. /**
  23. *BizAgent 接口
  24. */
  25. interface BizAgent extends Person{
  26. /**
  27. * 讲解业务
  28. */
  29. public void giveBizSpeech();
  30. }
  31. /**
  32. *软件工程师类
  33. */
  34. class SoftEngineer implements Programmer,BizAgent{
  35. private String name;//软件工程师姓名
  36. public SoftEngineer(String name){
  37. this.name=name;
  38. }
  39. public String getName(){
  40. return name;
  41. }

  42. public void giveBizSpeech(){
  43. System.out.println("我会讲业务。");
  44. }
  45. public void writeProgram(){
  46. System.out.println("我会写代码。");
  47. }
  48. }
  49. /**
  50. *测试类
  51. */
  52. class Test
  53. {
  54.         public static void main(String[] args) {
  55.                 Programmer programmer=new SoftEngineer("小明");// 这句话: SoftEngineer 是Programmer接口的子类 这就是典型的多态问题。
  56.                 //父类的引用指向了子类对象 。 你要知道 SoftEngineer实现 了Programmer和BizAgent两个接口.
  57.                 BizAgent bizAgent= (BizAgent) programmer; // programmer是指向了SoftEngineer子类对象 。而你定义的SoftEngineer也是BizAgent接口的子类,所以可以转换成BizAgent类型。
  58.                 /*
  59.                  注意:
  60.                   <1>我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换。
  61.                   <2>多态自始至终都是子类对象在做着变化。
  62.                  */
  63.                 System.out.println("我是一名软件工程师,我的名字叫"+programmer.getName()+". ");
  64.                 programmer.writeProgram();
  65.                 bizAgent.giveBizSpeech();
  66.         }       
  67. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马