永发信息网

java中假设B继承A,C继承B 下面A a=new C();与C a=new C()有区别吗?多态到底是什么意思。

答案:5  悬赏:40  手机版
解决时间 2021-03-30 21:06
java中假设B继承A,C继承B 下面A a=new C();与C a=new C()有区别吗?多态到底是什么意思。
最佳答案
两种方式都实例化了C类的对象,但是引用不同,第一种只能调用A类里定义了方法,第二种A/B/C三个类里面定义的方法都可以调用。将第一种new出来的对象a进行强转为C类应用后即可调用A/B/C类的所有方法,因为他自己本来就是C类对象。多态是指,如果A类定义了方法fun()而后B类或C类重写了方法fun(),则new的C类对象只会调用最后重写的fun()方法,即B类或C类的fun()方法。示例:
public class 车(){
public void 发动(){靠某种动力发动};
public void 运行(){可以跑};
public void 装载(){可以装物品};
}
public class 汽车() extends 车{
public void 发动(){靠发动机发动};
public void 装载(){可以载人};
}

public class 公交车() extends 汽车{
public void 装载(){可以载很多人};
public void 报站(){到公交站可以报站让乘客下车};
}

车 a = new 公交车();//实例化了一个公交车,但是我们只知道它是车;
公交车 c = new 公交车();//实例化了一个公交车,而且我们知道它是公交车;
a.发动();//a是车,可以调用“车”类定义的“发动”方法,实际上它是公交车,公交车也是汽车,所以是靠发动机发动;
c.发动();//c是公交车,公交车是汽车,可以调用继承自“汽车”类的重写的“发动”方法,靠发动机发动;
a.运行();//a是车,可以调用“车”类定义的“运行”方法,可以跑;
c.运行();//c是公交车,公交车也是车可以调用继承自“车”类定义的“运行”方法,可以跑;
a.装载();//a是车,可以调用“车”类定义的“装载”方法,实际上它是公交车,所以它可以载很多人;
c.装载();//c是公交车,可以调用“公交车”类重写的“装载”方法,可以载很多人;
c.报站();//c是公交车,到公交站可以报站让乘客下车;
((公交车)a).报站();//a本来是公交车,但是我们只知道它是车,不一定会报站,现在把它强转为公交车,那我们就知道他是公交车了,可以报站,到公交站可以报站让乘客下车。

总体而言就是:对象能调用哪个方法是根据我们所知道的它是哪个类来看,而调用该方法实际执行的操作是根据它实际上是哪个类来看。子类继承父类就有了父类的方法,而重写父类的方法就改掉了实际执行的操作。这就是多态。

希望对你有帮助。
全部回答
【C a=new C()】
这个你好像写错了吧?java允许这样写吗?这个我也不确定
多态就是----不同的对象,接收到同一指令,做出不同的反应,这是我的理解
for example:如果听到上课的铃声,有的学生在翻开书本,有的学生从教室外进来,老师带着课本和教案来到教室铃声是相同的,但每个人的反应都不同,这个就是多态
楼下回答的比我专业多了,仔细看看他的回答吧!
多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
多态有两种表现形式:重载和覆盖
首先说重载(overload),是发生在同一类中。与什么父类子类、继承毫无关系。
标识一个函数除了函数名外,还有函数的参数(个数和类型)。也就是说,一个类中可以有两个或更多的函数,叫同一个名字而他们的参数不同。
他们之间毫无关系,是不同的函数,只是可能他们的功能类似,所以才命名一样,增加可读性,仅此而已!

再说覆盖(override),是发生在子类中!也就是说必须有继承的情况下才有覆盖发生。

我们知道继承一个类,也就有了父类了全部方法,如果你感到哪个方法不爽,功能要变,那就把那个函数在子类中重新实现一遍。
这样再调用这个方法的时候,就是执行子类中的过程了。父类中的函数就被覆盖了。(当然,覆盖的时候函数名和参数要和父类中完全一样,不然你的方法对父类中的方法就不起任何作用,因为两者是两个函数,毫不关系)

A a=new C();
创建的是父类A的对象,调用的方法是A中的方法
C a=new C()
创建子类C的对象,调用的方法是C中的方法
当然有区别,如果C中某方法是新的,并非继承自某个A或B中的方法,那你对A a=new C();中的a无法调用此方法,编译就通不过,而对C a=new C();中的a就可以调用此方法。
如果此方法继承自A或B,那么即使在C中重写了此方法,这两个句子产生出来的a调用此方法产生的结果都是一样的,这就是多态性。
但上面这话不适合于静态成员和静态方法,比如你可以在A,B,C中都定义
public static String getS()
并返回不同值,这几个getS()之间不是重写的关系而是各管各的。如果是
A a=new C();
那么a.getS()返回的是A下的那个结果(所以一般不建议这么写,而是应该写A.getS()以减少误解的可能性)

C a=new C();那么a.getS()返回的是C下的那个结果。
主要是类型上的区别,A a=new C();调用了类C的构造器,创建了A的对象a,
C c=new C();调用了类C的构造器,创建了c的对象c,因为继承关系C是A的间接子类,所以c对象可以获得a对象的所有public方法,a表现了c的行为,有自己的行为,不是相同的,要注意。
多态:表现为同一个类中方法的重载使相同的方法名有不同的表现。以及子类继承父类,子类重写了父类的方法,在子类中与父类同名的方法就不能表现出父类方法的行为,而是由自己的行为
你自己仔细的体会重写和重载。慢慢就会明白的
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
喝伊瘦果蔬酵素粉喝3天了怎么没有瘦一点还胖
百年古法秘术堂真的有效吗?
闵行虹井路280弄2号虹桥晶座大厦3楼平安公司
求名求名,李(?)宇
20选八有什么技巧
读“黄土高原示意图”回答下列问题(1)写出
朋友搬新家去温锅送什么东西好
请藏传活佛念经祈求升学运给多少钱
村里要拆迁之前都在盖房子,怎么举报他们?
23个拼音声母怎么读?
不胜其苦拼音
为什么大领导都坐丰田中巴和尼桑中巴?开道的
刚买一个月的苹果 7 可以卖多少钱 就是新的
k807次列车09号车厢40,41靠窗吗,
外经320内径190宽100的轴承型号是多少
推荐资讯
12年买的机子,配置是这,需要加个什么样的显
津门飞鹰什么时候上映
从银行借入短期借款10000直接偿还应付账款到
水利监理工程师还能使用多久
iOS中如何判断UITextFilde里面不为空
1+2-3%4/5*(17/6)在Java中详细的解法
滁州十二里半以后怎么规划?
219管道直对325管道偏心三通怎么做
求奔波儿灞与灞波儿奔头像。图片。谢谢!
引起无意注意产生的原因是什么 心理学概论
防弹少年团专辑在哪买 防弹少年团专辑多少钱
这只股票的开盘价是多少?是15.60元还是15.55
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?