简易Java(18):属性能否重写?为什么?
来源:互联网 发布:和飞行员谈恋爱 知乎 编辑:程序博客网 时间:2024/06/06 08:42
本文将给大家介绍面向对象编程中一个基本的概念–属性隐藏(Field Hiding)。
1、Java中,属性能否被覆盖?
来让我们看看下面的这个示例代码,它创建了两个子类实例:一个被赋值给子类引用,另外一个赋值给父类引用。
01
package
com.diguage.books.simplejava.ar18;
02
03
/**
04
* 属性隐藏示例
05
* <p/>
06
* Coder:D瓜哥,http://www.diguage.com/
07
* <p/>
08
* Date: 2015-01-25 19:48
09
*/
10
class
Super {
11
String s =
"Super"
;
12
}
13
14
class
Sub
extends
Super {
15
String s =
"Sub"
;
16
}
17
18
public
class
FieldOverriding {
19
public
static
void
main(String[] args) {
20
Sub c1 =
new
Sub();
21
System.out.println(c1.s);
22
23
Super c2 =
new
Sub();
24
System.out.println(c2.s);
25
}
26
}
输出是什么呢?
1
Sub
2
Super
我们创建了两个Sub
对象,但是为什么第二个却打印出了Super
呢?
2、隐藏属性而非覆盖属性
在《The Java Language Specification》中,有关于属性隐藏的清晰定义:
在一个类中,相同姓名的属性,子类的属性隐藏父类的同名属性,即使它们的类型不同。在子类中,不能通过简单的名称来引用父类的属性。属性必须通过父类类来访问。一般而言,我们不推荐使用属性隐藏,因为这样的代码不易阅读。
从这个定义可以看出,类属性不能像方法那样覆盖。当子类使用相同姓名定义一个属性时,它是在声明一个新的属性。因此,它们不能通过多态方式来访问。他们不能被覆盖,这就以为着他们被隐藏了。它们只能通过两种方式来访问。
3、访问隐藏属性的方式
- 通过父类引用类型,这个隐藏的父类属性就能被访问了,承接上面的例子,可以通过下面的方式来访问。
- 通过强制类型转换,可以访问父类的属性。
1
System.out.println(((Super) c1).s);
《Simple Java》是一本讲解Java面试题的书。讲解也有不少独特之处,努力坚持做好一件事,《简易Java》走起!
作 者: D瓜哥,http://www.diguage.com/
原文链接:http://www.diguage.com/archives/128.html
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
原文链接:http://www.diguage.com/archives/128.html
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
0 0
- 简易Java(18):属性能否重写?为什么?
- Java中的静态方法能否被重写?
- java静态方法能否被重写
- java静态方法能否被重写
- java构造函数能否被继承,为什么?
- java 为什么要重写clone()?
- Java中private属性能否被继承
- java的object重写equals时为什么有必要重写hashcode
- JAVA中重写equals()方法为什么要重写hashcode()方法?
- JAVA中重写equals()方法为什么要重写hashcode()方法?
- JAVA中重写equals()方法为什么要重写hashcode()方法?
- Java重写equals方法时为什么要重写hashcode方法
- JAVA中重写equals()方法为什么要重写hashcode()方法?
- JAVA中重写equals()方法为什么要重写hashcode()方法?
- JAVA中重写equals()方法为什么要重写hashcode()方法?
- JAVA中重写equals()方法为什么要重写hashcode()方法?
- JAVA中重写equals()方法为什么要重写hashcode()方法?
- JAVA中重写equals()方法为什么要重写hashcode()方法
- 判断数据库中是否存在情况
- 拓扑排序算法
- GRE数学备考时草稿纸如何利用
- android studio的gradle说解
- showModalDialog chrome 新版本解决方案
- 简易Java(18):属性能否重写?为什么?
- Action中访问Servlet API
- iOS开发多线程篇—GCD的常见用法
- 实验--多线程
- 浅谈 JavaScript 编程语言的编码规范
- 点击精灵区域消除,点击其他区域创建新精灵。(模拟放置炸弹,及引爆)
- Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)
- Linux SSH远程文件/目录传输命令scp
- Linux socket文件传输2