class Base1{
public static final int a=5;
Base1(){}
}public class Sub extends Base1{
public static final int a=6;//居然不报错?
Sub(){}
public static void main(String[] args) {
System.out.println(a);
}}
如上代码所示,final类型的,怎可继承到子类的时候,又修改了呢?而且父类中有一个a了,子类中又定义了一边,2歌a?请教高手。
public static final int a=5;
Base1(){}
}public class Sub extends Base1{
public static final int a=6;//居然不报错?
Sub(){}
public static void main(String[] args) {
System.out.println(a);
}}
如上代码所示,final类型的,怎可继承到子类的时候,又修改了呢?而且父类中有一个a了,子类中又定义了一边,2歌a?请教高手。
解决方案 »
- Spring问题,麻烦高手出手
- velocity自定义函数问题
- 难道真是程序导致Out Of Memory??
- [wldeploy] at java.io.File.<init>(File.java:194)
- 关于ajax+jsp+servlet注册功能
- 如何把从数据库中读取出来的图片按指定大小显示到JSP页面中
- 大家能推荐一个好的开源连接池工具么?
- applet,Servlet,javaBeans,JSP,JDBC,J2EE这么多,我该怎么学???啊
- 菜鸟求助!Form表单无法提交至servlet!!
- Dbviualizer如何连接内存数据库?
- 希望我的这篇文章,林信良 老师能看到
- SSH iframe问题
class Base1{
public static final int a=5;
Base1(){}
}
public class aaaaaa extends Base1{
public static void main(String[] args) {
public static final int a=6;
System.out.println(a);
}
}
这样就有错了
class Base1{
public static final int a=5;
Base1(){}
public static void print(){
System.out.println("Base1 a is " + a);
}
}public class test extends Base1{
public static final int a=6;//居然不报错?
test(){
}
public void sayout(){
print();
}
public static void main(String[] args) {
System.out.println(a);
new test().sayout();
}}
结果:
6
Base1 a is 5
个人认为,子类继承父类,创建子类时,首先会new 出一个空间,分两部分【父类,子类特有】。
对于变量也是一样。同样的两个a,分别存放在两个类特有的区域。就算是static变量,也是分别存放在各自的静态变量区。对编译器而言,它关心的是两个a的地址,而不是变量名称,因为两个a存放位置不同,也不存在同名报错的问题。所以出现了貌似覆盖的现象。
private int field;
public Bar(int field) { // 这里的局部变量field隐藏了字段field
this.field = field; // 要访问字段field,必须加上限定符
}
}所以你的Sub类中其实也有两个a,一个是Base1的,一个是Sub自己的,要在Sub中访问Base1中的a,就必须加上限定符super
到这就结束!