- 浏览: 19932 次
文章分类
- 全部博客 (17)
- Struts (0)
- Servlet (1)
- Interview (1)
- Shell (1)
- java (5)
- Linux (0)
- ACM (1)
- 程序员 (0)
- Sprint (0)
- Spring (1)
- WEB (0)
- 学习方法 (0)
- JSP (0)
- other problems Collecting (0)
- Hibernate (0)
- Thread (1)
- AWT (0)
- 生活哲理 (0)
- IT 人物 (1)
- IT knowledge (0)
- 版本管理软件 (1)
- 深入java (0)
- Oracle (0)
- Activity (0)
- GUI (1)
- English (0)
- 网络编程 (0)
- Practice (0)
- 项目实践 (0)
- 金融 (0)
- 面试 (1)
- 新知识 (0)
- 温故旧知识 (0)
- 账户管理 (0)
- IT 警言 (1)
- 学习 (0)
- Strus (0)
- 问题 (0)
- 武术 (0)
- 经济 (0)
- 项目 (0)
- 项目构建工具 (0)
- 每天学习 (0)
- 面试题 (0)
- 编程实践-解题(Solution) (0)
- 领悟 (0)
- log (0)
- 编程 (0)
- 算法 (0)
- Java 学习 (0)
- 好好学习,天天进步-每一天的时间都一样,但是可以有不同的价值 (0)
- 幸福 (0)
- hibernate 实践笔记 (0)
- Spring 实践笔记 (0)
- 设计模式系列 (0)
- acm 练习总结 (0)
- JVM 学习 (0)
- 目标 (0)
- 人生准则 (0)
- 开源 框架 (0)
- AOP 学习系列 (0)
- java 网络编程 (0)
- 源码学习 (0)
- ClassLoader (0)
- 动态代理 (0)
- 开源项目 (0)
- 编码 (0)
- 我的生活领悟 (0)
- 事务安排 (0)
- 电话面试 (0)
- 学习笔记 (0)
- 开源软件学习 (0)
- PLSQL (0)
- 面试准备 (0)
- 日记 (0)
- 离职找工作日记 (0)
- hibernate 学习 (0)
- tomcat 源码学习 (0)
- 成长日记 (0)
- 算法学习-从概念开始一点一点的学习 (0)
- Spring MVC (0)
- 进步的人生 (0)
- 一定要坚定 (0)
- 程序员的实力 (0)
- 学习进步-日知其所亡,月无忘其所能,学无先后,快慢,达者为先,通者为先。 (0)
- 日知其所亡,月无忘其所能,学无先后,快慢,达者为先,通者为上 (0)
- 公积金 (0)
- test (0)
参考
http://topic.csdn.net/u/20120415/21/524a6daa-e703-4382-8f42-8c3eb2b51d4f.html?16896 提的问题
参考
http://blog.csdn.net/thinkGhoster/article/details/2307001# thinkGhoster
对多态的分析
常见的Java 多态的概念需要基于继承与方法重写的概念。只有准确满足这两种情况(满足这个基本概念的要求),才会出现多态。
目前遇到的多态情况分为:
Case1: 父类引用指向子类对象
运行结果为:B
上面例子中父类引用a指向了子类对象,然后调用了fun 方法,由于该方法被子类B 重写,所以运行时会调用B的fun 方法。
Case2:父类的方法调用了一个被子类重写的方法,这个时候还是会调用子类的方法,这个应该也是多态。具体例子:
运行结果为:B
注意:如果将父类的fun 方法设为private ,那么因为不能被继承,所以不会出现多态。具体例子:
运行结果为A
补充:多态的方法调用问题:引自csdn thinkGhoster 的代码例子
运行结果:
A and A
A and A
A and D
B and A
B and A
B and A
A and D
B and B
B and C
A and D
这里涉及到知识(个人参考一些东西总结,不一定正确,如有疑问,请指正):
方法调用时:
如果方法是private ,static ,final 的,那就进行静态绑定,在编译期就可以确定
否则:
例如上面的a2.show(c) 方法,运行时首先会确定a2引用变量的声明类型A,然后寻找合适的方法调用,这个遵循thinkGhoster 总结的原则:先查看A类中有没有精确匹配的方法签名,如果没有再到A的父类中查找有没有,如果还是没有,则从A类中寻找合理的模糊匹配,因为c所应用的对象也是A类型,所以就找到了public String show(A obj) 这个方法。如果还是没有找到模糊匹配,则还会到父类中去找模糊匹配(这个一定能找到,否则会在编译期就报错,表示找不到想要调用的方法),找到了之后,
如果引用变量的实际类型与声明类型不一致,这时还需要考虑多态的情况,及如果引用变量所指向的实际对象的类型重写了该方法,那么就会调用实际对象的类型的方法。
http://topic.csdn.net/u/20120415/21/524a6daa-e703-4382-8f42-8c3eb2b51d4f.html?16896 提的问题
参考
http://blog.csdn.net/thinkGhoster/article/details/2307001# thinkGhoster
对多态的分析
常见的Java 多态的概念需要基于继承与方法重写的概念。只有准确满足这两种情况(满足这个基本概念的要求),才会出现多态。
目前遇到的多态情况分为:
Case1: 父类引用指向子类对象
class A{ public void fun(){ System.out.println("A"); } } class B extends A{ public void fun(){ System.out.println("B"); } } public class TestOverride { public static void main(String[] args) { A a = new B(); a.fun(); } }
运行结果为:B
上面例子中父类引用a指向了子类对象,然后调用了fun 方法,由于该方法被子类B 重写,所以运行时会调用B的fun 方法。
Case2:父类的方法调用了一个被子类重写的方法,这个时候还是会调用子类的方法,这个应该也是多态。具体例子:
class A{ public void fun(){ System.out.println("A"); } public void f(){ this.fun(); } } class B extends A{ public void fun(){ System.out.println("B"); } } public class TestOverride { public static void main(String[] args) { B b = new B(); b.f(); } }
运行结果为:B
注意:如果将父类的fun 方法设为private ,那么因为不能被继承,所以不会出现多态。具体例子:
class A{ private void fun(){ System.out.println("A"); } public void f(){ this.fun(); } } class B extends A{ public void fun(){ System.out.println("B"); } } public class TestOverride { public static void main(String[] args) { B b = new B(); b.f(); } }
运行结果为A
补充:多态的方法调用问题:引自csdn thinkGhoster 的代码例子
class A { public String show(D obj){ return ("A and D"); } public String show(A obj){ return ("A and A"); } } class B extends A{ public String show(B obj){ return ("B and B"); } public String show(A obj){ return ("B and A"); } public String show(C obj){ return ("B and C"); } } class C extends B{} class D extends B{} class Test{ public static void main(String[] args){ A a1 = new A(); A a2 = new B(); B b = new B(); C c = new C(); D d = new D(); System.out.println(a1.show(b)); System.out.println(a1.show(c)); System.out.println(a1.show(d)); System.out.println(a2.show(a2)); System.out.println(a2.show(b)); System.out.println(a2.show(c)); System.out.println(a2.show(d)); System.out.println(b.show(b)); System.out.println(b.show(c)); System.out.println(b.show(d)); } }
运行结果:
A and A
A and A
A and D
B and A
B and A
B and A
A and D
B and B
B and C
A and D
这里涉及到知识(个人参考一些东西总结,不一定正确,如有疑问,请指正):
方法调用时:
如果方法是private ,static ,final 的,那就进行静态绑定,在编译期就可以确定
否则:
例如上面的a2.show(c) 方法,运行时首先会确定a2引用变量的声明类型A,然后寻找合适的方法调用,这个遵循thinkGhoster 总结的原则:先查看A类中有没有精确匹配的方法签名,如果没有再到A的父类中查找有没有,如果还是没有,则从A类中寻找合理的模糊匹配,因为c所应用的对象也是A类型,所以就找到了public String show(A obj) 这个方法。如果还是没有找到模糊匹配,则还会到父类中去找模糊匹配(这个一定能找到,否则会在编译期就报错,表示找不到想要调用的方法),找到了之后,
如果引用变量的实际类型与声明类型不一致,这时还需要考虑多态的情况,及如果引用变量所指向的实际对象的类型重写了该方法,那么就会调用实际对象的类型的方法。
发表评论
-
java 内置的比较器
2012-06-28 12:04 947在java 里,有一些内置的比较器,比如CaseInsensi ... -
java 每日学习
2012-06-22 11:57 0今天看了简单工厂模式与工厂方法模式,然后看的过程中碰到一些问题 ... -
java RTTI- runtime type information (think in java )
2012-06-18 23:53 0Class 类 equals 方法比较与 instanceof ... -
ant 使用
2012-05-30 00:39 0ant : a neat tool 1.下载 ant ht ... -
java multithread
2012-05-24 13:24 0java 多线程 使用condition 来控制协调。 区别 ... -
java Queue
2012-05-24 10:39 0java Collection Queue 的实现及 Pri ... -
网络连接例子
2012-05-20 20:39 0来自java 学习室 -
java io 集合 笔试题
2012-05-18 18:44 0摩根笔试题: import java.io.Buffere ... -
f(n) = f(n-1) + f(n-2) 实现(递归与非递归运行时间比较)
2012-05-18 15:40 2511Fibonacci 算法递归实现与非递归实现时间比较: ... -
学习 JAVA IO
2012-05-17 00:29 0http://www.java3z.com/cwbwebhom ... -
java Runtime
2012-05-16 22:47 0Java垃圾回收时需要用到Runtime(这是一个单例模式), ... -
装饰模式
2012-05-16 12:19 0问题: 根据问题来学习,并学习如何理解讲解问题更透彻明白,及学 ... -
java io 设计
2012-05-15 22:46 0转载自: http://www.blogjav ... -
垃圾回收
2012-05-14 21:34 0参考垃圾回收电子书: ... -
java 基础
2012-05-03 23:50 710读 《研读设计模式》 简单工厂的优缺点: 帮助封装 简单工厂 ... -
Java 集合
2012-04-23 12:04 896今天在做如何从两个数组中取出相同的元素时碰到了一个问题,想知道 ...
相关推荐
java多态、继承练习题,包含题目与答案,............................................................................................................
Java多态的讲解
JAVA多态图文详解ppt,详细通过各种举例介绍JAVA多态的ppt
Java 多态中的类型转换
java多态的基础知识,你可能了解,但是如何使用?内附例子。究竟如何实现,帮你学习基础。
java的多态,是一个很重要的环节.但是要知道什么是多态!
C++和Java多态的区别
【Java面试题】谈谈对Java多态的理解
利用大量代码讲解java的多态,让你更容易理解和应用。
从虚拟机角度看Java多态->(重写override)的实现原理
java多态import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ComplexListener implements MouseMotionListener,MouseListener,ActionListener{ JFrame f; JTextArea tf; JButton ...
java 的多态是java的重要的四大特性之一,多态又有多少人真正说的清楚呢?这里有最经典的例子,最生动的最鲜活的例子讲解,相信你一定能学会
这边文章的编程代码:https://blog.csdn.net/qq_41086359/article/details/103650238 Java多态,面向对象编程题
该资料,是一个多态的例子,充分的掌握多态,让多态得到很好的应用
Java多态的实现机制,多态是java的三大属性之一,开发中很重要的一个环节
RTRTRTRTRT 多态的泛型实现 急需积分...
java多态实验,为一些小代码。属于课堂老师布置的做些,很实用。
java 个人对于多态理解和一些笔记。
用代码实例和注释向你讲述什么是多态,实例更容易理解
本文带您通过几个类的示例和讲解来理解Java多态性,Java多态性的概念也可以被说成“一个接口,多个方法