阅读教程

JAVA面试题系列(三)变量

[日期:2008-07-15] 来源:  作者:志伟

我们来看看这么一道题:

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

控制台的输出结果是多少呢?20?40?还是60?

变量,或者叫做类的属性,在继承的情况下,如果父类和子类存在同名的变量会出现什么情况呢?这就是这道题要考查的知识点——变量(属性)的覆盖。

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

我们先从普通变量说起。依照我们的惯例,先来看一段代码:

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

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

  1. ParentClass parentClass = new ParentClass();
  2. 父类变量--private
  3. 父类变量--friendly
  4. 父类变量--protected
  5. 父类变量--public
  6. ParentClass subClass = new SubClass();
  7. 子类变量--private
  8. 父类变量--friendly
  9. 父类变量--protected
  10. 父类变量--public
  11. SubClass subClazz = new SubClass();
  12. 子类变量--private
  13. 子类变量--friendly
  14. 子类变量--protected
  15. 子类变量--public


 



[1] [2] 下一页   
      
      使用百度搜索:JAVA面试题系列(三)变量百度中搜索:JAVA面试题系列(三)变量
阅读:
录入:志伟

评论 】 【 推荐 】 【 打印
上一篇:JAVA面试题系列(二)创建String对象
下一篇:JAVA面试题系列(四)final、finally和finalize的区别
本文评论       全部评论
发表评论


点评: 字数
姓名:

 
搜一下


 
关于我们 | 广告合作 | 法律声明 | 联系站长 | 网站地图 | 网站搜索 | | Top ↑
Copyright © 志伟教程资料网 Powered by zhiweinet 1.0
 本栏目提供:JAVA面试题系列(三)变量