考考你对java多态的理解
请看如下代码, 如果你能不运行得出正确答案, 那你真的超过99%的java程序员了. [本人属于最大头的那部分]
public class A{
public String s = "A";
public void setS(String s){
this.s = s;
}
public String getS(){
return this.s;
}
}
public class B extends A{
public String s = "B";
public void setS(String s){
this.s = s;
}
public String getS(){
return this.s;
}
public static void main(String[] args){
A a = new A();
B b = new B();
a.setS("[AA]");
b.setS("[BB]");
a = b;
System.out.print(a.s);
System.out.print(b.s);
System.out.print(a.getS());
System.out.print(b.getS());
}
}
输出的结果是多少呢? [AA][BB][AA][BB]或者[AA][BB][BB][BB],这两个答案你会选择其中哪个? 其实这两个答案都是错误的, 正确是: A[BB][AA][BB]. 这里考察的一个知识点是子类的引用指向了父类类型, 看你是否深入理解过.
在java的继承里属性是不支持多态的,只有方法支持多态. 可能你会想方法不支持多态那么a.s那么会输出"[AA]"才对啊.其实当执行了a = b; 这条赋值语句后, a对象与他原来new出来的对象没有任何关系了.
b对象在构造出来之前,jvm会先初始并生成一个b对象的父类实例也就是A类的对象,那么A对象的属性 s 当然就被默认初始化为"A"了. 执行a = b这条语句, a对象其实是指向了b对象的隐藏父类对象(就是b对象生成之前构造出的父类对象),我们就能理解为什么输出这个结果了. 那么方法调用输出的结果,自然是体现了java中的多态了后面三个结果都是"[BB]".
[由于个人能力有限, 写的不准确的地方欢迎大家多多指正, 共同学习!]
参考:http://blog.csdn.net/zdwzzu2006/article/details/5979886
考考你对java多态的理解的更多相关文章
- 关于java多态的理解
要理解多态,就必须有一个大的理解方向,不然很容易绕进去. 首先知道多态的释义:多态性是指一个名词可以有多种语义. 对于java的多态性学习者来说,就是必须要知道多个同名方法在不同情况下的使用规则. j ...
- Java经验杂谈(2.对Java多态的理解)
多态是面向对象的重要特性之一,我试着用最简单的方式解释Java多态: 要正确理解多态,我们需要明确如下概念:・定义类型和实际类型・重载和重写・编译和运行 其中实际类型为new关键字后面的类型. 重载发 ...
- 对java多态的理解
java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是“向上转型”. 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过 Cat c = new C ...
- Java多态-如何理解父类引用指向子类对象
java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是“向上转型”. 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过 Cat c = new ...
- java多态的理解
面向对象语言中的类有三个特征,封装.继承.多态.封装与继承很好理解,那什么是多态呢? 1.什么是多态? 多态的定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同 ...
- java多态的理解----部分非原创
所谓多态,其实就是对于同一件事情,不同的对象要采取不同的行为,或者同一个对象在不同的情况下需要采取不同的行为方式. 不同的对象要采取不同的行为: 这有两种实现方式:接口实现和子类重新父类方法.这两种实 ...
- java四大特性理解(封装继承多态抽象)
封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治.封装的对象,这些对象通过一个受保护的接口访问其他对象.封装是一 ...
- 深入理解java多态没有烤山药的存在,java就不香了吗?
目录 1. 从吃烤山药重新认识多态 2. 多态前提条件[重点] 3. 多态的体现 4. 多态动态绑定与静态绑定 5. 多态特性的虚方法(virtual) 7. 向上转型 8. 向下转型 9. 向上向下 ...
- Java中的继承、封装、多态的理解
Java中的继承.封装.多态 继承的理解: 1.继承是面向对象的三大特征之一,也是实现代码复用的重要手段.Java的继承具有单继承的特点,每个子类只有一个直接父类. 2.Java的继承通过extend ...
随机推荐
- 【ACM】poj_2092_Grandpa is Famous_201308021920
Grandpa is FamousTime Limit: 2000MS Memory Limit: 30000K Total Submissions: 7256 Accepted: 3670 De ...
- mybatis mapper xml文件配置resultmap时,id行和result行有什么区别?
mybatis mapper xml文件配置resultmap时,id行和result行有什么区别? <resultMap id = "CashInvoiceMap" typ ...
- C#带cookie模拟登录百度
#region 同步通过POST方式发送数据 /// <summary> /// 通过POST方式发送数据 /// </summary> /// <param name= ...
- ZOJ2724_Windows Message Queue(STL/优先队列)
解题报告 题意: 看输入输出就非常明确. 思路: 优先队列. #include <algorithm> #include <iostream> #include <cst ...
- 利用runtime动态生成对象?
利用runtime我们能够动态生成对象.属性.方法这特性 假定我们要动态生成DYViewController,并为它创建属性propertyName 1)对象名 NSString *class = @ ...
- SpringMVC实战(三种映射处理器)
1.前言 上一篇博客,简单的介绍了一下SpringMVC的基础知识,这篇博客来说一下SpringMVC中的几种映射处理器机制. 2.三种映射处理器 2.1 BeanNameUrlHandlerMapp ...
- 好吧,我承认我喜欢这种多个 StoryBoard 组织的方式,学习了!
下面转载内容非常不错.兴许补充从官方文档疏理出来的脉络,确实非常好的使用方法. tid-270505.html"> tid-270505.html">Storyboar ...
- contest hunter5105 Cookies
神题 先按贪婪值大到小排序,根据贪心的思想g[i]越大a[i]也越大(这个微扰可以证,给个提示,a>b且c<d 则 (a-b)(c-d)<0 则 ac+bd<ad+bc) DP ...
- php简单表格函数
php简单表格函数 代码 <?php //ctrl+shift+j /** * @param unknown $rows * @param unknown $cols * @param stri ...
- JavaScript --晋级--优
https://zhuanlan.zhihu.com/p/23412169 总计划 JavaScript 教程 http://www.w3school.com.cn/js/ JavaScr ...