黑马程序员技术交流社区

标题: 多态的一个问题,不是很清楚 [打印本页]

作者: 晓风妮子    时间: 2013-4-22 18:07
标题: 多态的一个问题,不是很清楚
class ADemo {
public ADemo show(){
  return new ADemo();
}
}
class BDemo extends ADemo{
public BDemo show(){
  return new BDemo();
}
}
为什么我这样写是不报错的呢?

作者: 殇_心。    时间: 2013-4-22 18:49
public BDemo show(){
   return new BDemo();
} //这是对父类方法的重写。返回一个子类对象,是属于父类的。
我这样理解:
这里相当于 ADemo a = new BDemo();//现实举例:一个动物的对象创建一个狗。

作者: 何锦权    时间: 2013-4-22 19:36

在多态的情况下,复写,子父类的返回值类型是可以不一样的
但两者必须要有关系,而且子类的返回值类型应比父类的返回值类型小或者相等


class Fu
{
        public Object show()
        {
                System.out.println("Fu");
                return new Object();
        }
}

class Zi extends Fu
{
        public String show()
        {
                System.out.println("Zi");
                return "";
        }
}

class Demo1
{
        public static void main(String args[])
        {
                Fu z = new Zi();
                z.show();//输出Zi,证明了Zi里复写了Fu中的show方法
        }
}

作者: 郭登旭    时间: 2013-4-22 19:44
  1. class ADemo
  2. {
  3.         public ADemo show()
  4.         {
  5.                 System.out.println("ADemo show()");
  6.                 return new ADemo();
  7.         }
  8. }

  9. class BDemo extends ADemo
  10. {
  11.         public BDemo show()
  12.         {
  13.                 System.out.println("BDemo show()");
  14.                 return new BDemo();
  15.         }
  16. }

  17. public class Test3
  18. {
  19.         public static void main(String []args)
  20.         {
  21.                 ADemo a=new ADemo();
  22.                 a.show();               //输出ADemo show()
  23.                 BDemo b=new BDemo();
  24.                 b.show();               //输出BDemo show()
  25.                 ADemo c=new BDemo();
  26.                 c.show();               //输出BDemo show()
  27.         }
  28. }
复制代码
我的理解:
编译通过,并且c.show()输出的是子类的show方法,说明子类重写了父类中的show方法。
虽然子类中的show方法返回值与父类show方法返回值不同,但子类show方法的返回值类型是父类show方法返回值类型的子类,子类对象会自动向上转型,所以BDemo中的
show方法相当于
public ADemo show()
{
    return new BDemo();
}
所以子类重写了父类的show方法。
作者: 蚂蚁搬家    时间: 2013-4-22 20:33
好像不是方法的重写吧,方法的重写要求方法的方法头必须一致,不能更改,即:返回值类型、方法名、形参都不能更改,访问控制符权限不能高于父类的方法。
楼主的类Bdemo中的show方法的返回值类型已经变了,显然是又重新定义了一个方法,不应该是重写。
作者: 黄玉昆    时间: 2013-4-22 21:43
如果问题未解决,请继续追问,如果问题解决了,请将问题分类改为“已解决”,谢谢
作者: 陈湘林    时间: 2013-4-22 22:58
  1. 多态体现在两方面
  2.         方法的重载和覆写(方法的多态)
  3.         对象的多态(接口来实现)
  4. 两种情况
  5.         向上转型:父类 父类对象=子类实例(利用接口实现,常用)
  6.         向下转型:子类 子类对象=(子类)父类示例,(利用继承实现,基本不用)
  7. 扩展时,上层代码不用改,下层随便改,这种现象就叫多态,可以分工同时工作,提高效率
  8. public interface IPlane {
  9.         public void canFly();
  10. }
  11. public interface IShip {
  12.         public void canFloat();
  13. }
  14. public class ShipPlane implements IShip,IPlane{

  15.         @Override
  16.         public void canFloat() {
  17.                 System.out.println("水上飞机会漂");
  18.         }

  19.         @Override
  20.         public void canFly() {
  21.                 System.out.println("水上飞机会飞");
  22.         }
  23.        
  24. }
  25. public class Test {
  26.         public void byShip(IShip iship){
  27.                 iship.canFloat();
  28.         }
  29.         public void byPalne(IPlane iplane){
  30.                 iplane.canFly();
  31.         }
  32.         public static void main(String[] args) {
  33.                 Test t=new Test();
  34.                 IPlane ip=new ShipPlane();
  35.                 t.byPalne(ip);
  36.         }
  37. }
  38. public class XiaoYingHao implements IShip{
  39.         @Override
  40.         public void canFloat() {
  41.                 System.out.println("小鹰号航母在漂浮");
  42.         }
  43. }
  44. public class ZhiShengFeiJi implements IPlane{

  45.         @Override
  46.         public void canFly() {
  47.                 System.out.println("直升飞机在飞");
  48.         }
  49.        
  50. }
复制代码

作者: 张变    时间: 2014-2-25 14:18
因为在new BDemo()时, BDemo()构造方法已经new Aemo(),
作者: 平凡成就非凡    时间: 2014-2-25 14:59
重载与方法的访问权限,参数列表,方法名有关,与返回类型无关。




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