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?请教高手。

解决方案 »

  1.   

    final常量是不会被继承过去的。
      

  2.   


    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);         
        }
    }
    这样就有错了
      

  3.   


    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存放位置不同,也不存在同名报错的问题。所以出现了貌似覆盖的现象。
      

  4.   

    对于用final 限定的常量,不能被继承,在程序中也不能修改它的值~~同意二楼的~
      

  5.   

    这个其实与"覆盖"没有什么关系。这个叫"name shadow",与下面的代码相似:class Bar {
      private int field;
      public Bar(int field) {  // 这里的局部变量field隐藏了字段field
        this.field = field;    // 要访问字段field,必须加上限定符
      }
    }所以你的Sub类中其实也有两个a,一个是Base1的,一个是Sub自己的,要在Sub中访问Base1中的a,就必须加上限定符super
      

  6.   

    我们老师的话:“final就是太监”,没有后代!
    到这就结束!