java中多态是怎么实现的?

shixitong 2010-01-27 01:53:18
如题,希望可以说的详细点。
...全文
4095 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
龙的传人1988 2012-02-28
  • 打赏
  • 举报
回复
多态成立的三个条件
1.继承
2.子类重写父类方法
3.父类引用指向子类对象
例:
class A {
void fun(){}
}

class B extends A { //继承
void fun(){ //重写父类方法
System.out.println("supClass");
}
}

class Test {
public staic void main(Strings[] args){
A a = new B(); //父类引用指向子类对象
a.fun(); //多态
}
}

在编译时无法确定是执行A里面的方法还是B里面的方法,只有在运行时才能确定执行的方法。
chenwenqiao 2011-07-21
  • 打赏
  • 举报
回复
ddj0406 2011-03-25
  • 打赏
  • 举报
回复
殊途同归
final_xt 2010-01-28
  • 打赏
  • 举报
回复
java是用后期绑定这个概念来实现多态的,具体可以参考<thinking in java>第一章,或者直接google
xxpp688 2010-01-28
  • 打赏
  • 举报
回复
先说方法的多态:

顾名思义“多态”,方法的多种形态;
【多态的官方定义是:  多态(Polymorphism)是面向对象技术的核心概念,按字面意思就是“多种形状”。Java语言的多态不是一个独立特性,其优越性体现在类的继承、使用接口等多方面,同时也使人感觉较难理解。理清与多态有关的概念,有助于在程序设计中正确实现多态】

简单的说就是方法的重写Overriding和重载Overloading是Java多态性的不同表现;(需要你好好看看Overriding,与Overloading我在这儿就不说了)

需要注意的是:
当父类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。

将子类对象赋值给父类对象,所得到对象是这样的一个对象:
它是一个编译是为父类对象,但运行却是一个子类对象,具体特征如下.
1.被声明为父类对象
2.拥有父类属性
3.占用子类的内存空间
4.子类方法覆盖父类的方法时,此时对象调用的是子类的方法;否则,自动调用继承父类的方法.

多态的目的
通过类型转换,把一个对象当作它的基类对象对待。
从相同的基类派生出来的多个派生类可被当作同一个类型对待,可对这些不同的类型进行同样的处理。
这些不同派生类的对象响应同一个方法时的行为是有所差别的,这正是这些相似的类之间彼此区别的不同之处。

当然还有继承多态,接口多态···涉及太广了,你自己找本书系统化一下

wolf521hf 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 luffyke 的回复:]
顶一楼
附加一个生动的说法
什么是多态
老大要收高利贷,对三个小弟说,给我去跟某某某收高利贷(这就是一个借口,定义收高利贷方法)
三个小弟A,B,C听到了之后采取不同的行动,
A:打电话过去威胁说不换就XXX(这就是具体的实现)恐吓
B: 直接带家伙杀到他家楼下等(这也是实现)威逼
C:直接面谈,说换1W返回1百,下次再借,利率打折(这也是实现)利诱
相同的动作对不同的类有不同的实现方法,这就是多态。
失敬失敬
[/Quote]
精辟
dracularking 2010-01-28
  • 打赏
  • 举报
回复
我理解多态定义上就是要通过统一、抽象的形式去完成复杂多变的需求
x.invoke();

x是不同的,但是属于一个派生系
invoke形式是相同的,但实现不同
具体定位到哪个实现是由x的本质决定的
这对jvm来说x是什么是非常清楚的 动态加载、动态绑定
代码都在那了
yaoguicheng 2010-01-28
  • 打赏
  • 举报
回复
对于这个问题,先了解下什么叫方法绑定

将一个方法调用同一个方法主题关联起来被称作“绑定(binding)”。若在程序运行前进行绑定,叫做“前期绑定(early binding)”,编译器只有这一种方法调用;若在程序运行时进行绑定,叫做“动态绑定(dynamic binding)”(也有叫“后期绑定”、“运行时绑定”的)。
JAVA中,除了final和static方法,其他所有的方法都是动态绑定的。这也给多态机制提供了条件。

多态的实现,就是运行时由JVM自动的根据对象引用来选择正确的方法体。
多态的实现有两种方式:覆盖和重载。上面已经讲的很清楚了,这里不赘述了。
guo56560058 2010-01-27
  • 打赏
  • 举报
回复
多态,简单点说就是:重写加重载。
详见任意一本java书。
yangchao36 2010-01-27
  • 打赏
  • 举报
回复
不要想多了 简单点就是一个子类的对象指向一个父类的引用
father f=new son()
nihuajie05 2010-01-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 healer_kx 的回复:]
JVM 指令 invokevirtual 调用方法,就是调用派生类的方法了。

这样就要讲到如何编译一段代码,是编译invokevirtual,还是invokestatic。。。
一个函数是不是static的,还不是很清楚的事情吗,另外非final private的函数,都是virtual函数。
你说好编译不?
[/Quote]
赞C++高手。。。
xllee 2010-01-27
  • 打赏
  • 举报
回复
复习了
keeya0416 2010-01-27
  • 打赏
  • 举报
回复
这个问题关系到Java中方法的动态绑定问题
建议楼主去看下 thinking in Java
那里边比较仔细
Sou2012 2010-01-27
  • 打赏
  • 举报
回复
多态。。 就是

public interface Parent
{
public void printf();
}

class ChildB
{
public void printf()
{
// to do
}
}

class ChildB
{
void printf()
{
// to do
}
蛋黄车 2010-01-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 luffyke 的回复:]
顶一楼
附加一个生动的说法
什么是多态
老大要收高利贷,对三个小弟说,给我去跟某某某收高利贷(这就是一个借口,定义收高利贷方法)
三个小弟A,B,C听到了之后采取不同的行动,
A:打电话过去威胁说不换就XXX(这就是具体的实现)恐吓
B: 直接带家伙杀到他家楼下等(这也是实现)威逼
C:直接面谈,说换1W返回1百,下次再借,利率打折(这也是实现)利诱
相同的动作对不同的类有不同的实现方法,这就是多态。
失敬失敬
[/Quote]
学习了!~
luffyke 2010-01-27
  • 打赏
  • 举报
回复
顶一楼
附加一个生动的说法
什么是多态
老大要收高利贷,对三个小弟说,给我去跟某某某收高利贷(这就是一个借口,定义收高利贷方法)
三个小弟A,B,C听到了之后采取不同的行动,
A:打电话过去威胁说不换就XXX(这就是具体的实现)恐吓
B: 直接带家伙杀到他家楼下等(这也是实现)威逼
C:直接面谈,说换1W返回1百,下次再借,利率打折(这也是实现)利诱
相同的动作对不同的类有不同的实现方法,这就是多态。
失敬失敬
whlcy 2010-01-27
  • 打赏
  • 举报
回复
http://news.newhua.com/news1/program_net/2009/922/09922143128BAI28F2H431A54CKHH5H3F3FHIDH651H4F4H868FAC4HG.html
licip 2010-01-27
  • 打赏
  • 举报
回复
对的[Quote=引用 4 楼 gardner2010 的回复:]
以重载和重写来实现的
[/Quote]
wuyongai0563 2010-01-27
  • 打赏
  • 举报
回复
多态 实现有两种方式 一种就是楼上说的,继承 ; 另一种就是 方法 重载
加载更多回复(4)

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧