java 有关动态绑定的理解

jywbd 2010-10-10 05:51:38
虽然,我也经常用到java动态绑定的特性,但老实说,我还是对这一特性一知半解,请求谁能简单通俗的解释下哦

public class Father {
public void method() {
System.out.println(" 父类方法,对象类型:" + this.getClass());
}
}

public class Son extends Father {
public void method() {
System.out.println(" 子类方法,对象类型:" + this.getClass());
}

public static void main(String[] args) {
Father sample = new Son();// 向上转型
sample.method();
}
}

运行结果大家很清楚,但是,我还是不明白,java到底是怎么动态绑定到Son对应的方法中,而不是Father哦?
...全文
407 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
my_beginning 2012-09-16
  • 打赏
  • 举报
回复
我想知道更多关于动态分析的内容,有哪位大神可以指教?小女子真心不懂,真心想会。
凉岑玉 2010-10-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 mybeautiful 的回复:]
所谓动态绑定,是这个概率搞复杂了,说白了就是,
你定义了有一个"类型" A, 这个A可能是个接口,也可能是个抽象类或是普通类,如

Java code

public class Test {
A a; //
public void setA (A aa){
this.A=aa;
}
}


这样,……
[/Quote]
哥们··这是动态绑定吗?是不是搞错了?
Java多态的内容真有这么难吗?还不结贴撒··
fhlkm 2010-10-14
  • 打赏
  • 举报
回复
看看!
sesese12345 2010-10-14
  • 打赏
  • 举报
回复
sample 虽然是父类的对象 但是程序实际new的是子类 程序是访问你实际new什么对象而调用什么方法的
8一天不 2010-10-13
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 jay304216304 的回复:]
引用 3 楼 b452608 的回复:

动态绑定满足三个条件:
1。需要有继承的存在。
2。需要有方法的重写
3。父类引用指向子类对象。
你的程序都满足这三点。

当父类引用指向子类对象时。就像你的代码Father sample = new Son();// 向上转型
sample.method();
sample是不能调用子类的方法的。那么为什么程序的结果是子类的方法呢??……
[/Quote]

对,sample强制转换为Sun类型后是可以用非继承来的方法的。但是没强制转换的话就不能调用子类的方法。
雕虫大计 2010-10-13
  • 打赏
  • 举报
回复
动态绑定应该是在程序运行的时候,得到对象的真正类型,从而调用其方法。
静态绑定就是编译期就已经知道其类型。

应该讲明白了。
jywbd 2010-10-13
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 lzw190 的回复:]
动态绑定应该是在程序运行的时候,得到对象的真正类型,从而调用其方法。
静态绑定就是编译期就已经知道其类型。

应该讲明白了。
[/Quote]

我当然知道呀,我只是想知道怎么实现这个功能的哦?
jay304216304 2010-10-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 b452608 的回复:]

动态绑定满足三个条件:
1。需要有继承的存在。
2。需要有方法的重写
3。父类引用指向子类对象。
你的程序都满足这三点。

当父类引用指向子类对象时。就像你的代码Father sample = new Son();// 向上转型
sample.method();
sample是不能调用子类的方法的。那么为什么程序的结果是子类的方法呢???这就是方法的覆盖。我们看到……
[/Quote]

你说sample不能调用子类的方法,是因为覆盖,意思是非继承来的方法都丢了吗,只有Father里的方法吗,
可如果是这样,那sample强制转换为Sun类型后不是还能用非继承来的方法吗
Mybeautiful 2010-10-12
  • 打赏
  • 举报
回复
所谓动态绑定,是这个概率搞复杂了,说白了就是,
你定义了有一个"类型" A, 这个A可能是个接口,也可能是个抽象类或是普通类,如

public class Test {
A a; //
public void setA (A aa){
this.A=aa;
}
}

这样,你开始new这个Test对象是,是不是a是null (没有实例化)? 然后在程序运行中,你可以随时调用 setA给 a赋个值, 比如ccc。 这就是所谓的动态绑定。注意这个ccc一定是A的实现,或子类.

注意:这里的setA方法,只是我想说明动态绑定的一种实现方法,并不是唯一的方法。


故:动态绑定就是,在程序运行中实例化某个"类型".

凉岑玉 2010-10-12
  • 打赏
  • 举报
回复
这个程序不足以让你了解多态··你可以看看我的博客里的··我有一个Java多态随堂笔记··那里写的很清楚··
凉岑玉 2010-10-12
  • 打赏
  • 举报
回复
我觉得这个不是覆盖··而是说··Father sample = new Son()这句话··创建的是一个子类对象··但是被当作父类对象来使用··也就是说··这个命名是一个儿子,但被当作是他爸爸来使用··当你调用方法的时候,其实调用的是当前对象的方法··也就是儿子的方法··自然··输出的就是子类重写了父类的方法之后的方法的内容··
zczh3 2010-10-12
  • 打赏
  • 举报
回复
虚函数都是这样实现的
jywbd 2010-10-12
  • 打赏
  • 举报
回复
大家继续讨论哦
风影萧诺 2010-10-12
  • 打赏
  • 举报
回复
父类方法执行,子类在执行。。。。
chchenun 2010-10-12
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20101010/17/76b449c3-916e-41a2-91e8-a7ba932df906.html?23225
jywbd 2010-10-12
  • 打赏
  • 举报
回复
希望大家继续讨论下
8一天不 2010-10-11
  • 打赏
  • 举报
回复
动态绑定满足三个条件:
1。需要有继承的存在。
2。需要有方法的重写
3。父类引用指向子类对象。
你的程序都满足这三点。

当父类引用指向子类对象时。就像你的代码Father sample = new Son();// 向上转型
sample.method();
sample是不能调用子类的方法的。那么为什么程序的结果是子类的方法呢???这就是方法的覆盖。我们看到的是假象。其实sample还是调用的是父类的method()方法。但是它已经被覆盖了。原来的methoed()就变成我们看到的子类的method()。这下,你应该懂了吧。
主要特性Java 语言是简单的:Java 语言的语法与 C 语言和 C++ 语言很接近,使得大多数程序员很容易学习和使用。另一方面,Java 丢弃了 C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java 语言不使用指针,而是引用。并提供了自动分配和回收内存空间,使得程序员不必为内存管理而担忧。Java 语言是面向对象的:Java 语言提供类、接口和继承等面向对象的特性,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为 implements)。Java 语言全面支持动态绑定,而 C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。Java语言是分布式的:Java 语言支持 Internet 应用的开发,在基本的 Java 应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括 URL、URLConnection、Socket、ServerSocket 等。Java 的 RMI(远程方法激活)机制也是开发分布式应用的重要手段。Java 语言是健壮的:Java 的强类型机制、异常处理、垃圾的自动收集等是 Java 程序健壮性的重要保证。对指针的丢弃是 Java 的明智选择。Java 的安全检查机制使得 Java 更具健壮性。Java语言是安全的:Java通常被用在网络环境中,为此,Java 提供了一个安全机制以防恶意代码的攻击。除了Java 语言具有的许多安全特性以外,Java 对通过网络下载的类具有一个安全防范机制(类 ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类 SecurityManager)让 Java 应用设置安全哨兵。Java 语言是体系结构中立的:Java 程序(后缀为 java 的文件)在 Java 平台上被编译为体系结构中立的字节码格式(后缀为 class 的文件),然后可以在实现这个 Java 平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。Java 语言是可移植的:这种可移植性来源于体系结构中立性,另外,Java 还严格规定了各个基本数据类型的长度。Java 系统本身也具有很强的可移植性,Java 编译器是用 Java 实现的,Java 的运行环境是用 ANSI C 实现的。Java 语言是解释型的:如前所述,Java 程序在 Java 平台上被编译为字节码格式,然后可以在实现这个 Java 平台的任何系统中运行。在运行时,Java 平台中的 Java 解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中。Java 是高性能的:与那些解释型的高级脚本语言相比,Java 的确是高性能的。事实上,Java 的运行速度随着 JIT(Just-In-Time)编译器技术的发展越来越接近于 C++。Java 语言是多线程的:在 Java 语言中,线程是一种特殊的对象,它必须由 Thread 类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为 Thread(Runnable) 的构造子类将一个实现了 Runnable 接口的对象包装成一个线程,其二,从 Thread 类派生出子类并重写 run 方法,使用该子类创建的对象即为线程。值得注意的是 Thread 类已经实现了 Runnable 接口,因此,任何一个线程均有它的 run 方法,而 run 方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。Java 语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为 synchronized)。Java 语言是动态的:Java 语言的设计目标之一是适应于动态变化的环境。Java 程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。这也有利于软件的升级。另外,Java 中的类有一个运行时刻的表示,能进行运行时刻的类型检查。

62,617

社区成员

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

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