为了账号安全,请及时绑定邮箱和手机立即绑定

关于java多态的问题?

关于java多态的问题?

内向控 2016-11-14 10:38:46
我有一个父类animal子类dog然后animal obj1 = new dog();和dog obj2 = new dog();有什么区别?
查看完整描述

5 回答

已采纳
?
coder_Jason

TA贡献1条经验 获得超2个赞

我也纠结过这个问题,现在弄清楚了,首先你的第一种方式是,父类的引用指向子类的对象,这里会发生向上转型,也叫java中的多态,在第一种方式中,你可以通过父类的引用调用子类也就是dog中覆盖之后的父类方法,但是不能调用dog类中有而animal中没有的方法,而第二种方法就是一个简单的方式声明对象,可以调用自己的全部方法,由于dog是继承自animal的,所以也可以调用或访问animal中的方法和属性
查看完整回答
2 反对 回复 2016-11-14
  • 内向控
    内向控
    谢谢~~但是既然是这样为什么还要有animal obj1 = new dog呢?明明dog obj2 = new dog可以做和animal obj1 = new dog一样的事情而且比它做的更多。
  • coder_Jason
    coder_Jason
    是的,表面看起来是没什么作用,但是在下面的情况就显得非常有必要了,比如你考虑下,现在有一个类叫Instrument(乐器),因为乐器都能发出声音,所以Instrument类中有一个抽象方法makeSound(),因为每一种乐器发声的方式都不同,所以makeSound方法声明为抽象方法留给子类覆盖实现,然后现在有一个Instrument的子类叫Piano,它覆盖了makeSound方法,假设只是简单地输出一行I am a piano,那么假如另一个Stage类中声明了一个成员方法如下: perform(Instrument instrument) {instrument.makeSound();} ,现在多态的好处就很明显了,你考虑一下,为什么perform方法的参数是一个抽象类的实例?我们不是说抽象类是不能用new关键字来创建对象的吗?那这个参数是什么意思?bingo,其实我们在调用perform方法的时候,传进来的形参肯定是Instrument类的的子类对象,而当你把子类对象传进来的时候,是不是就相当于把一个子类对象赋值给了其父类Instrument的一个引用呢?是的,这里就发生了向上转型,而转型之后你却可以通过这个instrument引用去调用子类中覆盖之后的方法.这就是多态.你可能还有疑问,为什么我不把perform的参数设置为子类对象而要设置为Instrument的引用呢?因为Instrument乐器类肯定不止一个子类,如果你把参数设置为Piano 引用的话,那如果现在有一个guitar子类,那你还准备去写第二个参数为guitar的perform方法吗?这就是多态带来的好处,顺便提一下,java按钮的事件监听也是同样的道理
  • 内向控
    内向控
    额~~好难~~看不懂
点击展开后面1
?
mik1s

TA贡献4条经验 获得超2个赞

obj1 调用的方法 是animal的 实现方法 obj2调用的是 dog的方法, 如果animal中有自己单独多出来的方法,obj1 是不能调用的

查看完整回答
1 反对 回复 2016-11-15
?
我埋藏的东西你别挖

TA贡献13条经验 获得超14个赞

你可以这么理解 一对家庭有一对儿女,他们性别不同,样貌不同,但他们的父母都是同一人。

查看完整回答
反对 回复 2016-11-14
?
秋凉念夏y

TA贡献6条经验 获得超2个赞

效果是相同的,只是animal obj1 = new dog();是将子类dog的一个对象的引用交给了父类animal,这样obj1在调用它被dog继承的方法的时候就是在调用dog中的方法了,总之继承是为了多态

查看完整回答
反对 回复 2016-11-14
?
sntatas

TA贡献53条经验 获得超11个赞

obj1调用的public函数可以是子类Dog的,而obj1调用的其他函数如static,private,实例变量都是Animal的

查看完整回答
反对 回复 2016-11-14
?
星鸿

TA贡献6条经验 获得超0个赞

没区别吧,都是dog的对象

查看完整回答
反对 回复 2016-11-14
  • 5 回答
  • 0 关注
  • 2040 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信