刚网上看了两个例子,我测试了下,运行正常,但是很不解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是不是不是同一个的?
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是不是不是同一个的?
当子类的对象产生时,同名的变量被各自分配不同的空间,互不干扰。Java中把这种行为称为“域的隐藏”。这一点和方法的f覆盖不太相同,
因为父类的方法被覆盖时,该方法在子类对象中就不复存在,子类对象中只能保留自身定义的方法。而父类的成员变量在子类中只是被隐藏,它
在子类对象中仍占有自己独立的内存空间。