黑马程序员技术交流社区
标题:
多态的一个问题,不是很清楚
[打印本页]
作者:
晓风妮子
时间:
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
class ADemo
{
public ADemo show()
{
System.out.println("ADemo show()");
return new ADemo();
}
}
class BDemo extends ADemo
{
public BDemo show()
{
System.out.println("BDemo show()");
return new BDemo();
}
}
public class Test3
{
public static void main(String []args)
{
ADemo a=new ADemo();
a.show(); //输出ADemo show()
BDemo b=new BDemo();
b.show(); //输出BDemo show()
ADemo c=new BDemo();
c.show(); //输出BDemo show()
}
}
复制代码
我的理解:
编译通过,并且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
多态体现在两方面
方法的重载和覆写(方法的多态)
对象的多态(接口来实现)
两种情况
向上转型:父类 父类对象=子类实例(利用接口实现,常用)
向下转型:子类 子类对象=(子类)父类示例,(利用继承实现,基本不用)
扩展时,上层代码不用改,下层随便改,这种现象就叫多态,可以分工同时工作,提高效率
public interface IPlane {
public void canFly();
}
public interface IShip {
public void canFloat();
}
public class ShipPlane implements IShip,IPlane{
@Override
public void canFloat() {
System.out.println("水上飞机会漂");
}
@Override
public void canFly() {
System.out.println("水上飞机会飞");
}
}
public class Test {
public void byShip(IShip iship){
iship.canFloat();
}
public void byPalne(IPlane iplane){
iplane.canFly();
}
public static void main(String[] args) {
Test t=new Test();
IPlane ip=new ShipPlane();
t.byPalne(ip);
}
}
public class XiaoYingHao implements IShip{
@Override
public void canFloat() {
System.out.println("小鹰号航母在漂浮");
}
}
public class ZhiShengFeiJi implements IPlane{
@Override
public void canFly() {
System.out.println("直升飞机在飞");
}
}
复制代码
作者:
张变
时间:
2014-2-25 14:18
因为在new BDemo()时, BDemo()构造方法已经new Aemo(),
作者:
平凡成就非凡
时间:
2014-2-25 14:59
重载与方法的访问权限,参数列表,方法名有关,与返回类型无关。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2