日期:2014-05-20  浏览次数:20988 次

JAVA面试题解惑系列(三)——变量(属性)的覆盖
原帖地址:http://zangweiren.javaeye.com/blog/211278

作者:臧圩人(zangweiren) 
网址:http://zangweiren.javaeye.com 

>>>转载请注明出处!<<< 

变量,或者叫做类的属性,在继承的情况下,如果父类和子类存在同名的变量会出现什么情况呢?这一次,我们就一起来回顾一下这个问题——变量(属性)的覆盖。 

这个问题虽然简单,但是情况却比较复杂。因为我们不仅要考虑变量、静态变量和常量三种情况,还要考虑private、friendly(即不加访问修饰符)、protected和public四种访问权限下对属性的不同影响。 

我们先从普通变量说起。依照我们的惯例,先来看一段代码: 
Java代码 
class ParentClass {  
  private String privateField = "父类变量--private";  
  
  /* friendly */String friendlyField = "父类变量--friendly";  
  
  protected String protectedField = "父类变量--protected";  
  
  public String publicField = "父类变量--public";  
  
  // private的变量无法直接访问,因此我们给他增加了一个访问方法  
  public String getPrivateFieldValue() {  
  return privateField;  
  }  
}  
  
public class SubClass extends ParentClass {  
  private String privateField = "子类变量--private";  
  
  /* friendly */String friendlyField = "子类变量--friendly";  
  
  protected String protectedField = "子类变量--protected";  
  
  public String publicField = "子类变量--public";  
  
  // private的变量无法直接访问,因此我们给他增加了一个访问方法  
  public String getPrivateFieldValue() {  
  return privateField;  
  }  
  
  public static void main(String[] args) {  
  // 为了便于查阅,我们统一按照private、friendly、protected、public的顺序  
  // 输出下列三种情况中变量的值  
  
  // ParentClass类型,ParentClass对象  
  ParentClass parentClass = new ParentClass();  
  System.out.println("ParentClass parentClass = new ParentClass();");  
  System.out.println(parentClass.getPrivateFieldValue());  
  System.out.println(parentClass.friendlyField);  
  System.out.println(parentClass.protectedField);  
  System.out.println(parentClass.publicField);  
  
  System.out.println();  
  
  // ParentClass类型,SubClass对象  
  ParentClass subClass = new SubClass();  
  System.out.println("ParentClass subClass = new SubClass();");  
  System.out.println(subClass.getPrivateFieldValue());  
  System.out.println(subClass.friendlyField);  
  System.out.println(subClass.protectedField);  
  System.out.println(subClass.publicField);  
  
  System.out.println();  
  
  // SubClass类型,SubClass对象  
  SubClass subClazz = new SubClass();  
  System.out.println("SubClass subClazz = new SubClass();");  
  System.out.println(subClazz.getPrivateFieldValue());  
  System.out.println(subClazz.friendlyField);  
  System.out.println(subClazz.protectedField);  
  System.out.println(subClazz.publicField);  
  }  
}  

这段代码的运行结果如下: 

ParentClass parentClass = new ParentClass(); 
父类变量--private 
父类变量--friendly 
父类变量--protected 
父类变量--public 

ParentClass subClass = new SubClass();