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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐慧shanghai 中级黑马   /  2015-10-16 08:56  /  312 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Java中对象的初始化顺序相信很多初学者乃至入门很久了的朋友都不是很清楚,在此我自己通过看视频和网上资料总结后的知识分享给大家。希望对大家有所帮助。呵呵,多多交流哈。

当一个对象被创建时,初始化顺序:

  (1)设置成员的值为默认的初始值(0,false,null)。
  (2)调用对象的构造方法(但是还没有执行构造方法体)。
  (3)调用父类的构造方法。
  (4)使用初始化程序和初始块初始化成员。
  (5)执行构造方法体。
  class A {
  int va=fn();
  int fn() {
  System.out.println("父类的fn方法");
  return 10;
  }
  }
  class B extends A {
  int vb=va;
  int fn() {
  System.out.println("子类的fn方法");
  return 100;
  }
  }
  public class Test {
  public static void main(String[] args) {
  A a=new A();
  System.out.println(a.va);
  B b=new B();
  System.out.println(b.vb);
  }
  }

执行结果如下:
  父类的fn方法
  10
  子类的fn方法
  100

更具体的如下:
  初始化顺序:父类静态变量—>父类静态代码块—>子类静态变量—>子类静态代码块—>父类非静态变量—>父类非静态代码块—>父类构造方法—>子类非静态变量—>子类非静态代码块—>子类构造方法。

  class Father{
  //1
  private static int fs=10;
  //2
  static{
  System.out.println("1.父类静态变量fs="+fs);
  System.out.println("2.父类静态代码块");
  }
  //5
  private int ff=20;
  //6
  {
  System.out.println("5.父类非静态变量ff="+ff);
  System.out.println("6.父类非静态代码块");
  }
  //7
  public Father() {
  System.out.println("7.父类的构造方法");
  }
  }
  class Sun extends Father{
  //3
  private static int ss=100;
  //4
  static{
  System.out.println("3.子类静态变量ss="+ss);
  System.out.println("4.子类静态代码块");
  }
  //8
  private int sf=200;
  //9
  {
  System.out.println("8.子类非静态变量sf="+sf);
  System.out.println("9.子类非静态代码块");
  }
  //10
  public Sun() {
  System.out.println("10.子类的构造方法");
  }
  }
  public class Test {
  public static void main(String[] args) {
  new Sun();
  }
  }

  执行结果:
  1.父类静态变量fs=10
  2.父类静态代码块
  3.子类静态变量ss=100
  4.子类静态代码块
  5.父类非静态变量ff=20
  6.父类非静态代码块
  7.父类的构造方法
  8.子类非静态变量sf=200
  9.子类非静态代码块
  10.子类的构造方法

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马