刚网上看了两个例子,我测试了下,运行正常,但是很不解class ParentClass {
public static String staticField = "父类静态变量";
public final String finalField = "父类常量";
public static final String staticFinalField = "父类静态常量";
}
public class SubClass extends ParentClass {
public static String staticField = "子类静态变量";
public final String finalField = "子类常量";
public static final String staticFinalField = "子类静态常量";public static void main(String[] args) {
SubClass subClass = new SubClass();
System.out.println(SubClass.staticField);
// 注意,这里的subClass变量,不是SubClass类
System.out.println(subClass.finalField);
System.out.println(SubClass.staticFinalField);
}
}
运行结果如下:
1. 子类静态变量
2. 子类常量
3. 子类静态常量
在这里我很不理解,不是说一个变量给final修饰之后是不能再改变它的值吗,为什么子类可以呢,而且没有报错能运行?如果不是,那么父类和子类的两个常量finalField是不是不是同一个的?

解决方案 »

  1.   

    在类的继承中,如果子类有和父类同类型以及同名的成员变量,则子类此时拥有两个名字相同的变量,一个继承自父类,另一个由子类定义。
    当子类的对象产生时,同名的变量被各自分配不同的空间,互不干扰。Java中把这种行为称为“域的隐藏”。这一点和方法的f覆盖不太相同,
    因为父类的方法被覆盖时,该方法在子类对象中就不复存在,子类对象中只能保留自身定义的方法。而父类的成员变量在子类中只是被隐藏,它
    在子类对象中仍占有自己独立的内存空间。
      

  2.   

    变量不存在多态,你在谁中定义的就属于谁,楼主写的这种情况,其实是在子类中有保存了两个相同名称的变量,一个继承自父类,全程是super.变量名, 一个是自己定义的,全称是this.变量名 这样就不会存在命名冲突 并且当楼主创建子类的对象调用的时候,其实调用的是this.变量名,super.变量名没有被调用。