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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 zhangle 于 2014-4-14 15:46 编辑
  1. interface A{}
  2. class B implements A
  3. {
  4.         public String test()
  5.         {
  6.                 return "yes";
  7.         }
  8. }
  9. class Demo
  10. {
  11.         static A get()
  12.         {
  13.                 return new B();
  14.         }
  15.         public static void main(String[] args)
  16.         {
  17.                 A a = get();
  18.                 System.out.println(a.test());
  19.         }
  20. }
复制代码
该段代码结果为编译失败,但是不会详细分析,求高手指点

评分

参与人数 1技术分 +1 收起 理由
黑妞~ + 1

查看全部评分

6 个回复

倒序浏览
程序中a是A的对象,但是A中没有Test方法,你a.test();必然会报错
回复 使用道具 举报
通过接口只能调用接口中有的方法,也就是说将类B向上转型为接口A时,是不能调用接口A中以外的方法的
回复 使用道具 举报
这里涉及到多态的自动向上转型问题。
17行代码: A a = get();
get()返回的类型实际是B类,但因B类实现了A接口,故B类是A接口的实现子类,可用多态方式进行定义。
这里要注意的是,进行多态定义时,定义的子类会自动转型为A接口类型,只能调用A接口中的方法,不能获取子类中的特有方法,必须进行向下转型,才能调用子类特有方法。
  1. interface A{}
  2. class B implements A
  3. {
  4.         public String test()
  5.         {
  6.                 return "yes";
  7.         }
  8. }
  9. class Demo
  10. {
  11.         static A get()
  12.         {
  13.                 return new B();
  14.         }
  15.         public static void main(String[] args)
  16.         {
  17.                 A a = get();
  18.                 System.out.println(((B)a).test());//进行向下转型,调用B类中的特有方法
  19.         }
  20. }
复制代码


评分

参与人数 1技术分 +1 收起 理由
黑妞~ + 1

查看全部评分

回复 使用道具 举报
interface A{}
class B implements A
{
        public String test()
        {
                return "yes";
        }
}
class TestDemo
{
        static A get()
        {
                return new B();
        }
        public static void main(String[] args)
        {
                B a=new B();    //B类是A类的实现者,用B类来建一个对象,再用B的对象掉用A的的方法
                //A a = get();
                System.out.println(a.test());  
        }
}


说的不对,请多多指教,我也是新手!!
回复 使用道具 举报
A a = get();这一句对应的就是A a = new B();,多态忌讳的就是父类引用调用子类方法,必然产生异常
回复 使用道具 举报
谢谢大家啦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马