A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 王春蕾 中级黑马   /  2014-5-3 08:57  /  1771 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

下面是代码,请大家帮我看看运行结果和运行过程是什么样的呢

  1. class Base{
  2.         private int i = 2;
  3.          Base(){
  4.                 System.out.println("base:"+this.i);  //
  5.                 this.display();
  6.         }

  7.         public void display(){
  8.                 System.out.println("base display:"+this.i); //
  9.         }
  10. }
  11. class Derived extends Base {
  12.          public int i = 22;

  13.          public        Derived(){
  14.                 super();
  15.                 i = 222;        //
  16.          }
  17.          public void display(){
  18.                 System.out.println("derived display:"+i);
  19.          }
  20. }

  21. class TestI {
  22.         public static void main(String[] args){
  23.                 new Derived().display();
  24.         }
  25. }

  26. //问:打印结果?
复制代码

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

9 个回复

倒序浏览
一、打印的结果是
base:2
derived display:0
derived display:222

二、你这个问题综合性很强;涉及到对继承的理解、新建对象的赋值顺序和构造函数的初始化等基础知识。
首先,new Derived().display( );这句话要分两步走,
一是new一个Derived对象,这时程序就会找到Derived类的构造函数,构造函数中的super()方法又找到其父类的构造函数,执行第一条语句System.out.println("base:"+this.i);这里的 i 是Base中的 i,打印结果为base:2;接着执行第二条语句this.display();这里的this是指Derived对象,所以执行Derived类中的display方法,执行语句System.out.println("derived display:"+i); 这里 i 还是自己本类中的 i ,因为现在还在执行Base中的构造函数,故此时 i 的值是默认初始值 0 ,
至此,super()执行完毕;接下来执行 赋值语句,i = 222;

二是Derived对象的display方法,直接执行其方法中的System.out.println("derived display:"+i);语句,因为 i 在构造函数初始化时赋值为222,所以打印为derived display:222

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

回复 使用道具 举报
歌癫 发表于 2014-5-3 10:19
一、打印的结果是
base:2
derived display:0

{:2_41:}那为什么第二句的this是子类的对象呢?为什么不是像this.i一样调用父类的?
回复 使用道具 举报
歌癫 发表于 2014-5-3 10:19
一、打印的结果是
base:2
derived display:0


图片太小,不知道看得清不
回复 使用道具 举报
结果为:base:2   derived display:0    derived display:222
java程序中的静态变量,静态代码块,代码块,变量,构造器等运行顺序大致如下:(父类静态变量,父类静态初始化块)>(子类静态变量,子类静态初始化块)>(父类变量,父类初始化块,父类构造方法)>(子类变量,子类初始化块,子类构造方法)
所以此题中: new Derived().display();先找到Derived类,而且存在它的父类,所以先运行父类中的构造器Base(),this.i表示Derived类对象的i,所以this.i=2。故为:base:2。因为构造函数是初始化类中不同对象的,所所以运行this.display();其中的this.i=0(为默认值)。然后在执行Derived中的display()方法。所以结果为:base:2   derived display:0    derived display:222
回复 使用道具 举报
本帖最后由 hx小龙 于 2014-5-3 15:11 编辑
歌癫 发表于 2014-5-3 10:19
一、打印的结果是
base:2
derived display:0

哥们想问您下,那public int i = 22;和i=222,在建立对象以后谁会被先执行?
回复 使用道具 举报
NewDemo 发表于 2014-5-3 12:07
图片太小,不知道看得清不

this.display( );这里确实是指向父类对象,但是子类覆盖了父类的display( )方法,所以运行子类中的display方法,而父类的 i 又是私有的,子类不能继承,此时 i 就默认赋值为 0.
回复 使用道具 举报
hx小龙 发表于 2014-5-3 15:07
哥们想问您下,那public int i = 22;和i=222,在建立对象以后谁会被先执行?

当然是public int i = 22;先执行。然后才是 构造函数中的 i = 222 ,覆盖了之前的值。
回复 使用道具 举报
歌癫 发表于 2014-5-3 17:05
this.display( );这里确实是指向父类对象,但是子类覆盖了父类的display( )方法,所以运行子类中的displa ...

那个this是父类的引用没错,但是为什么调用了子类的方法还是没有绕过来弯,我再想想好了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马