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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 乔九 中级黑马   /  2012-10-21 22:30  /  921 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

interface A
{
}
class B implements A
{
        public void function()
         {
              System.out.pintln("func");
         }
}
class Demo
{
   public static void main(String[] args)
    {
              A a=new B();
              a.function();
     }
}
编译报错,A a=new B();这个不就是父类的引用指向子类的多态吗?

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1

查看全部评分

4 个回复

倒序浏览
  A a=new B();
a.function();
这其实就是向上转型问题,B转型之后相当于只能用A中的方法,但是你的接口A中没有方法,而B也不能再用自身的特有方法了,
想要用function()方法必须要向下转型:
A a=new B();
B b1=(B) a;
b1.function();

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1

查看全部评分

回复 使用道具 举报
在这里,程序中的B转型后要使用A的方法,但由于A没有方法,这时用function()方法的话,要采用向下转型才可以。
回复 使用道具 举报
A a=new B();这是向上转型,就相当于A的实例,而父类无法调用子类中function()方法,
加上B b=(B)a;
b.function();
就可以了
回复 使用道具 举报
首先,这个是父类的引用指向子类的多态不错。但是子类在实现父类的同时会复写父类的属性和方法,
但是代码中父类没有定义属性和方法,所以在子类B中的  function()方法  是子类增添的特有方法。
父类的引用指向子类, A a=new B();  子类会有自动提升类型与父类一致,所以会调用父类的功能,不会调用子类的特有方法。
而想要调用  a.function()方法,  需要强制降低类型才可以调用,a = (B)a;
  1. interface A  //父类中未定义属性和方法
  2. {
  3. }
  4. class B implements A
  5. {
  6.         public void function()      //子类特有的方法
  7.          {
  8.               System.out.pintln("func");
  9.          }
  10. }
  11. class Demo
  12. {
  13.    public static void main(String[] args)
  14.     {
  15.               A a=new B();    //类型自动提升,new B()自动转换为A引用类型。
  16.               a.function();      //调用方法,强制降低类型 a=(B)a;
  17.      }
  18. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马