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();