- 浏览: 20657 次
文章分类
- 全部博客 (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 974在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 2549Fibonacci 算法递归实现与非递归实现时间比较: ... -
学习 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 738读 《研读设计模式》 简单工厂的优缺点: 帮助封装 简单工厂 ... -
Java 集合
2012-04-23 12:04 944今天在做如何从两个数组中取出相同的元素时碰到了一个问题,想知道 ...
相关推荐
java多态、继承练习题,包含题目与答案,............................................................................................................
Java多态的讲解
JAVA多态图文详解ppt,详细通过各种举例介绍JAVA多态的ppt
在Java中,多态分为编译时多态和运行时多态。编译时多态主要体现在方法的重载(Overloading),即在同一个类中可以有多个同名方法,但参数列表不同。编译器会根据传入参数的类型和数量来决定调用哪个方法。运行时...
### Java多态经典讲解 #### 一、理解Java多态 多态,作为面向对象编程的三大特性之一,是继抽象和继承之后的关键概念。它允许我们以统一的接口处理不同类型的对象,增强了代码的灵活性和可扩展性。在Java中,多态...
本篇将深入探讨Java多态中的类型转换,包括向上转型(Upcasting)和向下转型(Downcasting),以及相关的注意事项。 1. **向上转型(Upcasting)** 向上转型是指将子类的对象引用赋值给父类的引用。在Java中,这是...
Java 多态详解 Java 多态是 Java 编程语言中的一种基本概念,它允许开发者定义一个接口,并且可以通过不同的类来实现该接口。多态性是 Java 面向对象编程的核心机制之一,它使得程序更加灵活、可维护和可扩展。 ...
### C++和Java多态的区别 #### 一、概述 多态是面向对象编程语言中的一个核心特性,它允许程序员能够使用基类的指针或引用指向派生类的对象,并在运行时根据对象的实际类型来选择合适的方法进行调用。这一特性增强...
【Java面试题】谈谈对Java多态的理解
Java多态是面向对象编程中的一个核心特性,它允许我们以一种统一的方式处理不同类型的对象。在Java中,多态性主要通过继承、接口和方法重写(Override)来实现。这里我们将深入探讨从虚拟机(JVM)的角度来看,Java...
6. ** finalize 方法**:虽然不是直接与多态相关的,但值得注意的是,Java中每个对象都有一个finalize()方法,这是垃圾收集器在回收对象前调用的,子类可以重写这个方法进行资源清理,但这并不保证一定会被调用,...
Java多态是面向对象编程中的一个核心概念,它允许我们使用父类的引用指向子类的对象,从而实现更灵活的代码编写。在这个“java多态实验”中,我们可以看到一系列小代码实例,这些实例旨在帮助理解和应用多态特性。...
多态在Java中有着深远的影响,它提高了代码的可重用性、灵活性和可扩展性。本篇将通过一个经典例子深入解析多态的含义,并通过实际代码展示其应用。 首先,我们要理解多态的定义。在Java中,多态性(Polymorphism)...
在Java中,多态主要体现在两个方面:方法重载(Overloading)和方法重写(Overriding)。方法重载是指在一个类中可以有多个同名方法,但参数列表不同;方法重写则是在子类中重新定义父类已有的非私有方法,以提供...
在给定的“java多态作业”中,可以看到多态性的应用主要体现在实现多个接口(MouseMotionListener、MouseListener和ActionListener),这些接口代表了不同的事件监听器,每个接口都定义了一系列方法来处理特定类型的...
Java多态是面向对象编程中的一个核心概念,它允许我们以一种统一的方式处理不同类型的对象。在Java中,多态性主要体现在方法的重写(Override)和重载(Overload)。通过多态,我们可以编写出更加灵活、可扩展的代码...
Java多态的实现机制 Java 多态的实现机制是面向对象程序设计中代码重用的一个重要机制。多态性是 Java 的三大属性之一,在开发中很重要的一个环节。多态性使对象能够调用正确的方法版本,从而提高代码的重用性和...
Java多态理解 java中的多态性是面向对象编程的精髓所在。多态性是指父类引用指向子类对象,例如父类Animal,子类Cat和Dog。其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类。Animal animal = ...
用代码实例和注释向你讲述什么是多态,实例更容易理解
多态性分为编译时多态和运行时多态,其中运行时多态是Java中最常见的形式,也称为动态绑定。在深入探讨Java中多态的内存分析之前,我们需要先理解一些基本概念。 首先,了解Java内存模型至关重要。Java程序运行时...