不好意思,忘了写问题
上面的程序输出为:
10
father is over ridden
请问为什么这样?为什么f.var1调用父类,而f.amethod()却调用字类的????
上面的程序输出为:
10
father is over ridden
请问为什么这样?为什么f.var1调用父类,而f.amethod()却调用字类的????
解决方案 »
- 十万火急求各位高手帮忙,要写一个能够自由添加文字的程序,文字最好能移动的,最后还要保存,我该怎么做呢?最好有代码,谢谢啦(十万火急)
- 请教 JPanel使用removeall()方法后内存释放情况
- 如何在SWing当中显示时间
- 空异常空异常空异常空异常空异常
- socket传文件,FileInputStream中的文件名是绝对路径吗?
- 如何将Java开发的软件在Linux上作为一个服务来运行?
- 请问swing中的双缓冲怎么用啊?
- =====有奖竟猜=====乌迪内斯Vs罗马===== 截止时间:4月10日-10点30分
- DBUnit可否在项目中代替DBHelper来链接数据库做操作数据库
- 请问谁了解Java Native Interface编程啊?
- session bean调用entity bean的一个奇怪的问题!
- 怎样调用动态连接库?
Father f = new Father();
Son s = new Son();
f = s;
这样f和s就指向了同一块存储空间,而由于他们的继承关系,是先初始化s,后初始化f,所以var就是10了。而对于函数,两个函数分别有自己的存储空间的,不会产生覆盖的问题。
不对,初始化是先父类再子类的。
你搞反了
运行一下就明白了
public static void main(String as[]) {
Son s,s1;
Father f=s=new Son();
s1=(Son)f;
System.out.println(f.var1);
System.out.println(s.var1);
System.out.println(s1.var1); f.amethod(); }
但是variable是shadow,即变量是不overriden的。
这里应该是hide的关系。
If the class declares a field with a certain name, then the declaration of that field is said to hide any and all accessible declarations of fields with the same name in superclasses, and superinterfaces of the class.
......
A hidden field can be accessed by using a qualified name (if it is static) or by using a field access expression (§15.11) that contains the keyword super or a cast to a superclass type. See §15.11.2 for discussion and an example.
“如果一个类声明了一个成员变量,则此声明会隐藏其父类和父接口中所有同名的、可以访问的成员变量。
...
被隐藏的成员变量如果是static的,则可以使用全名来访问它(这里全名就是package.class.field的形式),如果是非static的,可以用super.field 或强制类型转换为父类后进行访问。“
这是java语言规范中的一句话,如果我翻的不行请参照原文。
我的理解是: 顾名思义,hide是把父类的成员变量隐藏起来,你不会一眼就看见它(不能用正常的、简单的方式访问到它),而要揭开一层盖子才能发现(用super或cast到父类)。而override相信是比较清楚的,覆盖后原来的方法已经不存在了,你是无论如何也看不见它的。 回到father和son,sunjiujiu(芳芳)说的也有道理,“其实Father f = new Son() 相当于:
Father f = new Father();
Son s = new Son();
f = s;”
但我觉得 Father f= (Father)(new Son())更准确一点。因此在 f.var1是相当于有一个cast的动作,因此就访问到了被hide的Father中的var1,而f.amethod虽然也有cast,但是amethod已经被override了,也就只可能调用Son中的定义了。 至于shadow,通常是址在一个类(或一个代码块)中的重复定义。
class Test {
static int x = 1;
public static void main(String[] args) {
int x = 0;
System.out.print("x=" + x);
System.out.println(", Test.x=" + Test.x);
}
}此时在main中定义的x 就shadow了外部的x,当然只是在main(x的scope)中才会shadow,出了main后,x指的就是外部的x。
谢谢!
水平很高并且肯乐于助人,佩服佩服!!!
fen doesn't matter,CSDN出了问题,我的分还是几个月之间的记录。