考考你对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 ...
随机推荐
- [luogu4285 SHOI2008] 汉诺塔 (暴力,数学)
传送门 Solution 强行猜测公式形如\(f_i=k\times f_{i-1}+b\),暴力求\(f_1,f_2,f_3\),剩下的递推就行 Code #include <cstdio&g ...
- [luogu1971 NOI2011] 兔兔与蛋蛋游戏 (二分图博弈)
传送门 Solution 补一篇二分图博弈 这个博客写的很详细qwq: https://www.cnblogs.com/maijing/p/4703094.html Code //By Menteur ...
- Centos7下的有多个版本的tomcat部署项目并访问
在tomcat下部署项目,第一次访问成功.但是发现有一个页面没有成功加载,发现是部署时少了一些东西.也不想去找出具体少了什么,直接把原来的项目移除,重新加载项目.重启tomcat,这时惊喜来了. 重启 ...
- MAC 快捷键&使用技巧等
查看端口占用:命令 lsof -i tcp:port (port替换成端口号,比如6379)可以查看该端口被什么程序占用,并显示PID,方便KILL
- Codeforces 902C/901A - Hashing Trees
传送门:http://codeforces.com/contest/902/problem/C 本题是一个关于“树”的问题. 将一棵高度为h的有根树表示为数列{ai|i=0,1,2,...,h},其中 ...
- firebird的日期型字段
fb一大特色,日期型字段.dialect3时,对date time datetime是分的很清楚的.它们之间,你必须手把格式设定好,否则会报错.而不是你想象的会自动化:表xxx的date字段yyy,i ...
- 洛谷 P1560 [USACO5.2]蜗牛的旅行Snail Trails(不明原因的scanf错误)
P1560 [USACO5.2]蜗牛的旅行Snail Trails 题目描述 萨丽·斯内尔(Sally Snail,蜗牛)喜欢在N x N 的棋盘上闲逛(1 < n <= 120). 她总 ...
- Java EE: XML Schemas for Java EE Deployment Descriptors(Java Web的web.xml头web-app标签上的XML模式)
继上几篇文章 http://www.cnblogs.com/EasonJim/p/6221952.html http://www.cnblogs.com/EasonJim/p/6959120.html ...
- <图形图像,动画,多媒体> 读书笔记 --- 录制与编辑视频
使用UIImagePickerController 进行录制 #import "ViewController.h" #import <MobileCoreServices/M ...
- 【CSS】隐藏多行文本框Textarea在IE中的垂直滚动栏
在<[CSS]禁止Google浏览器同意定义调整多行文本框>(点击打开链接)中已经提及过怎样使多行文本框Textarea在一些DOM2的浏览器中固定下来. 这不,多行文本框Textarea ...