java 变量(属性)的覆盖

上传人:飞*** 文档编号:40209599 上传时间:2018-05-24 格式:DOC 页数:8 大小:48KB
返回 下载 相关 举报
java 变量(属性)的覆盖_第1页
第1页 / 共8页
java 变量(属性)的覆盖_第2页
第2页 / 共8页
java 变量(属性)的覆盖_第3页
第3页 / 共8页
java 变量(属性)的覆盖_第4页
第4页 / 共8页
java 变量(属性)的覆盖_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《java 变量(属性)的覆盖》由会员分享,可在线阅读,更多相关《java 变量(属性)的覆盖(8页珍藏版)》请在金锄头文库上搜索。

1、JAVA 面试题解惑系列(三)变量(属性)的覆盖 我们来看看这么一道题: Java 代码 class ParentClass public int i = 10; public class SubClass extends ParentClass public int i = 30; public static void main(String args) ParentClass parentClass = new SubClass(); SubClass subClass = new SubClass(); System.out.println(parentClass.i + subClas

2、s.i); /自加 System.out.println(parentClass.i);/10 System.out.println(subClass.i);/30 控制台的输出结果是多少呢?20?40?还是 60? 变量,或者叫做类的属性,在继承的情况下,如果父类和子类存在同名的变量会出现什么 情况呢?这就是这道题要考查的知识点变量(属性)的覆盖。 这个问题虽然简单,但是情况却比较复杂。因为我们不仅要考虑变量、静态变量和常量三 种情况,还要考虑 private、friendly(即不加访问修饰符) 、protected 和 public 四种访问权 限下对属性的不同影响。 我们先从普通变量说

3、起。依照我们的惯例,先来看一段代码: Java 代码 class ParentClass private String privateField = “父类变量-private“; /* friendly */String friendlyField = “父类变量-friendly“; protected String protectedField = “父类变量-protected“; public String publicField = “父类变量-public“; / private 的变量无法直接访问,因此我们给他增加了一个访问方法 public String getPrivate

4、FieldValue() return privateField; public class SubClass extends ParentClass private String privateField = “子类变量-private“; /* friendly */String friendlyField = “子类变量-friendly“; protected String protectedField = “子类变量-protected“; public String publicField = “子类变量-public“; / private 的变量无法直接访问,因此我们给他增加了

5、一个访问方法 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 P

6、arentClass();“); System.out.println(parentClass.getPrivateFieldValue(); /父类变量-private System.out.println(parentClass.friendlyField); /父类变量-friendly System.out.println(parentClass.protectedField);/ 父类变量-protected System.out.println(parentClass.publicField); /父类变量-publicSystem.out.println(); / ParentC

7、lass 类型,SubClass 对象 (子转父)ParentClass subClass = new SubClass(); System.out.println(“ParentClass subClass = new SubClass();“); System.out.println(subClass.getPrivateFieldValue(); /调用了子类的方法(方法覆盖),子类 变量-privateSystem.out.println(subClass.friendlyField); /父类变量-friendlySystem.out.println(subClass.protect

8、edField);/ 父类变量-protected System.out.println(subClass.publicField); /父类变量-publicSystem.out.println(); / SubClass 类型,SubClass 对象 SubClass subClazz = new SubClass(); System.out.println(“SubClass subClazz = new SubClass();“); System.out.println(subClazz.getPrivateFieldValue(); /子类变量-privateSystem.out.p

9、rintln(subClazz.friendlyField); /子类变量-friendlySystem.out.println(subClazz.protectedField); /子类变量-protectedSystem.out.println(subClazz.publicField); /子类变量-public 这段代码的运行结果如下: 1、ParentClass parentClass = new ParentClass(); 2、父类变量-private 3、父类变量-friendly 4、父类变量-protected 5、父类变量-public 6、 7、ParentClass

10、subClass = new SubClass(); 8、子类变量-private 9、父类变量-friendly 10、父类变量-protected 11、父类变量-public 12、 13、SubClass subClazz = new SubClass(); 14、子类变量-private 15、子类变量-friendly 16、子类变量-protected 17、子类变量-public 从上面的结果中可以看出,private 的变量与其它三种访问权限变量的不同,这是由于方法 的重写(override)而引起的。关于重写知识的回顾留给以后的章节,这里我们来看一下其 它三种访问权限下变量

11、的覆盖情况。 子类型的对象,可以覆盖父类属性。父类型的对象,构造方法是子类的(子转父)不能覆盖 属性,但子类同名实例方法被覆盖,同名静态方法不被覆盖,而子类方法可以直接访问子 类属性,父类方法只能访问父类属性,子类方法可以访问子类属性和父类属性(当然得有 权限) 。 由于 private 变量的特殊性,在接下来的实验中我们都把它排除在外,不予考虑。 由于上面的例子已经说明了,当变量类型是父类(ParentClass)时,不管我们创建的对象 是父类(ParentClass)的还是子类(SubClass)的,都不存在属性覆盖的问题,因此接下来 我们也只考虑变量类型和创建对象都是子类(SubClas

12、s)的情况。 Java 代码 class ParentClass /* friendly */String field = “父类变量“; public class SubClass extends ParentClass protected String field = “子类变量“; public static void main(String args) SubClass subClass = new SubClass(); System.out.println(subClass.field); /子类变量 运行结果: 1、子类变量 Java 代码 class ParentClass p

13、ublic String field = “父类变量“; public class SubClass extends ParentClass protected String field = “子类变量“; public static void main(String args) SubClass subClass = new SubClass(); System.out.println(subClass.field); 运行结果: 1、子类变量 上面两段不同的代码,输出结果确是相同的。事实上,我们可以将父类和子类属性前的访 问修饰符在 friendly、protected 和 public

14、之间任意切换,得到的结果都是相同的。也就是说 访问修饰符并不影响属性的覆盖,关于这一点大家可以自行编写测试代码验证。 对于静态变量和常量又会怎样呢?我们继续来看: Java 代码 class ParentClass public static String staticField = “父类静态变量“; public final String finalField = “父类常量“; public static final String staticFinalField = “父类静态常量“; public class SubClass extends ParentClass public s

15、tatic 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); /子类静态变量System.out.println(subClass.finalField); /子类常量System.out.println(SubClass.staticFinalField); /子类静态常量 运行结果如下: 1、子类静态变量 2、子类常量 3、子类静态常量 虽然上面的结果中包含“子类静态变量”和“子类静态常量”,但这并不表示父类的“静态变量” 和“静态常量”可以被子类覆盖,因为它们都是属于类,而不属于对象。 上面的例子中,我们一直用对象来对变量(属性)的覆盖做测试,如果是基本类型的变量, 结果是否会相同呢?答案是肯定的,这里我们就不再一一举例说明了。 *

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号