java 变量(属性)的覆盖.doc

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

《java 变量(属性)的覆盖.doc》由会员分享,可在线阅读,更多相关《java 变量(属性)的覆盖.doc(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 + subClass.i

2、); /自加System.out.println(parentClass.i);/10System.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 getPrivateFieldValue() return priv

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

5、eldValue() 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(par

6、entClass.getPrivateFieldValue(); /父类变量-private System.out.println(parentClass.friendlyField); /父类变量-friendly System.out.println(parentClass.protectedField);/ 父类变量-protected System.out.println(parentClass.publicField); /父类变量-public System.out.println(); / ParentClass类型,SubClass对象 (子转父) ParentClass su

7、bClass = new SubClass(); System.out.println(ParentClass subClass = new SubClass();); System.out.println(subClass.getPrivateFieldValue(); /调用了子类的方法(方法覆盖),子类变量-private System.out.println(subClass.friendlyField); /父类变量-friendly System.out.println(subClass.protectedField);/ 父类变量-protected System.out.pri

8、ntln(subClass.publicField); /父类变量-public System.out.println(); / SubClass类型,SubClass对象 SubClass subClazz = new SubClass(); System.out.println(SubClass subClazz = new SubClass();); System.out.println(subClazz.getPrivateFieldValue(); /子类变量-private System.out.println(subClazz.friendlyField); /子类变量-frie

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

10、 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)的,都不存在属性覆盖的问题,因此接下来我们也只考虑变量类型和创建对象都是子类(SubClass)的情况。 Java代码 class ParentClass /* friendly */String f

12、ield = 父类变量; 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 public String field = 父类变量; public class SubClass extends Par

13、entClass 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 static String staticField = 子类静态变量; public final String finalField = 子类常量; public s

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

当前位置:首页 > 生活休闲 > 社会民生

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