JAVA面试题解惑系列(三)——变量(属性)的覆盖我们来看看这么一道题:Java代码1.classParentClass{2.publicinti=10;3.}4.5.publicclassSubClassextendsParentClass{6.publicinti=30;7.8.publicstaticvoidmain(String[]args){9.ParentClassparentClass=newSubClass();10.SubClasssubClass=newSubClass();11.System.out.println(parentClass.i+subClass.i);12.}13.}控制台的输出结果是多少呢?20?40?还是60?变量,或者叫做类的属性,在继承的情况下,如果父类和子类存在同名的变量会出现什么情况呢?这就是这道题要考查的知识点——变量(属性)的覆盖。这个问题虽然简单,但是情况却比较复杂。因为我们不仅要考虑变量、静态变量和常量三种情况,还要考虑private、friendly(即不加访问修饰符)、protected和public四种访问权限下对属性的不同影响。我们先从普通变量说起。依照我们的惯例,先来看一段代码:Java代码1.classParentClass{2.privateStringprivateField="父类变量--private";3.4./*friendly*/StringfriendlyField="父类变量--friendly";5.6.protectedStringprotectedField="父类变量--protected";7.8.publicStringpublicField="父类变量--public";9.10.//private的变量无法直接访问,因此我们给他增加了一个访问方法11.publicStringgetPrivateFieldValue(){12.returnprivateField;13.}14.}15.16.publicclassSubClassextendsParentClass{17.privateStringprivateField="子类变量--private";18.19./*friendly*/StringfriendlyField="子类变量--friendly";20.21.protectedStringprotectedField="子类变量--protected";22.23.publicStringpublicField="子类变量--public";24.25.//private的变量无法直接访问,因此我们给他增加了一个访问方法26.publicStringgetPrivateFieldValue(){27.returnprivateField;28.}29.30.publicstaticvoidmain(String[]args){31.//为了便于查阅,我们统一按照private、friendly、protected、public的顺序32.//输出下列三种情况中变量的值33.34.//ParentClass类型,ParentClass对象35.ParentClassparentClass=newParentClass();36.System.out.println("ParentClassparentClass=newParentClass();");37.System.out.println(parentClass.getPrivateFieldValue());38.System.out.println(parentClass.friendlyField);39.System.out.println(parentClass.protectedField);40.System.out.println(parentClass.publicField);41.42.System.out.println();43.44.//ParentClass类型,SubClass对象45.ParentClasssubClass=newSubClass();46.System.out.println("ParentClasssubClass=newSubClass();");47.System.out.println(subClass.getPrivateFieldValue());48.System.out.println(subClass.friendlyField);49.System.out.println(subClass.protectedField);50.System.out.println(subClass.publicField);51.52.System.out.println();53.54.//SubClass类型,SubClass对象55.SubClasssubClazz=newSubClass();56.System.out.println("SubClasssubClazz=newSubClass();");57.System.out.println(subClazz.getPrivateFieldValue());58.System.out.println(subClazz.friendlyField);59.System.out.println(subClazz.protectedField);60.System.out.println(subClazz.publicField);61.}62.}这段代码的运行结果如下:1.ParentClassparentClass=newParentClass();2.父类变量--private3.父类变量--friendly4.父类变量--protected5.父类变量--public6.7.ParentClasssubClass=newSubClass();8.子类变量--private9.父类变量--friendly10.父类变量--protected11.父类变量--public12.13.SubClasssubClazz=newSubClass();14.子类变量--private15.子类变量--friendly16.子类变量--protected17.子类变量--public从上面的结果中可以看出,private的变量与其它三种访问权限变量的不同,这是由于方法的重写(override)而引起的。关于重写知识的回顾留给以后的章节,这里我们来看一下其它三种访问权限下变量的覆盖情况。分析上面的输出结果就会发现,变量的值取决于我们...