黑马程序员技术交流社区

标题: 关于多态 [打印本页]

作者: 乔九    时间: 2012-10-21 22:30
标题: 关于多态
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();这个不就是父类的引用指向子类的多态吗?
作者: 张其辉    时间: 2012-10-21 22:50
  A a=new B();
a.function();
这其实就是向上转型问题,B转型之后相当于只能用A中的方法,但是你的接口A中没有方法,而B也不能再用自身的特有方法了,
想要用function()方法必须要向下转型:
A a=new B();
B b1=(B) a;
b1.function();
作者: 刘学宾    时间: 2012-10-21 23:06
在这里,程序中的B转型后要使用A的方法,但由于A没有方法,这时用function()方法的话,要采用向下转型才可以。
作者: 王健宇    时间: 2012-10-21 23:12
A a=new B();这是向上转型,就相当于A的实例,而父类无法调用子类中function()方法,
加上B b=(B)a;
b.function();
就可以了
作者: 任雷彬    时间: 2012-10-21 23:13
首先,这个是父类的引用指向子类的多态不错。但是子类在实现父类的同时会复写父类的属性和方法,
但是代码中父类没有定义属性和方法,所以在子类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. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2