sun认证考试:java子对象创建过程

发布时间:2016-10-11 00:00:00 编辑:嘉辉 手机版

  Java 创建子类对象的过程:

  public class F511

  {

  private int ff=100;

  protected int m=880;

  F511()

  {

  m=add(8);

  }

  int add(int i){

  return i+m;

  }

  public static void main(String args[]){

  F511 f=new F511();

  System.out.println("f="+f.m);

  S511 s=new S511();

  System.out.println("s="+s.m+" t= "+s.t);

  }

  }

  class S511 extends F511

  {

  protected int ss=111;

  S511(){

  m+=ss;

  t=add(9);

  }

  int add(int i){

  return i*ss;

  }

  }

  大家自己先分析一下运算后的结果,然后在看下面结果:

  答案是:f=888

  m=111

  通过这个例子可以很好的学习到java继承父类,运行的先后顺序和机制。

  现在我添加一下东西到程序中,方便我们分析:

  public class F511

  {

  private int ff=100;

  protected int m=880;

  protected int t=880;

  static int k=0;

  F511()

  {

  System.out.println("this is parents = "+m);

  m=add(8);

  System.out.println("this is parents m=add(8) = "+m);

  }

  int add(int i){

  System.out.println("k= "+k);

  k++;

  return i+m;

  }

  public static void main(String args[]){

  F511 f=new F511();

  System.out.println("f="+f.m);

  S511 s=new S511();

  System.out.println("s="+s.m+" t= "+s.t);

  }

  }

  class S511 extends F511

  {

  protected int ss=111;

  static int j=0;

  S511(){

  System.out.println("this in childe print parents = "+m);

  m+=ss;

  t=add(9);

  }

  int add(int i){

  System.out.println("j= "+j);

  j++;

  System.out.println("ss= "+ss);

  return i*ss;

  }

  }

  运行结果是:

  this is parents = 880

  k= 0

  this is parents m=add(8) = 888

  f=888

  this is parents = 880

  j= 0

  ss= 0

  this is parents m=add(8) = 0

  this in childe print parents = 0

  j= 1

  ss= 111

  s=111 t= 999

  输出完成 (耗时 0 秒) - 正常终止

  从这里可以看出,子类继承父类后。在创建子类对象时,首先初始化父类的无参构造函数F511()执行其中的方法。由于父类无参构造方法中add()方法被子类重写了,因此父类调用子类的add()方法,这就是为什么会输出j=0,又由于父类中没有ss变量,所以ss默认就为0.所以父类初始化后,m=0了。然后才在初始化子类无参构造函数S511()。由于m变成了0,所m+=ss,就为111了。这就是创建子类,函数初始化的过程。

  所以,在构造器中有应避免调用可能被改写的方法,不然上上面会出现某些意想不到的结果。

本文已影响870
+1
0