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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 雨来 高级黑马   /  2015-10-14 08:30  /  642 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

创建对象时 初始化顺序
  先初始化父类的静态代码--->初始化子类的静态代码-->创建实例(如果不创建实例,则后面的不执行)初始化父类的非静态代码--->初始化父类构造函数--->初始化子类非静态代码--->初始化子类构造函数
  子类继承父类会先初始化父类,调用父类的构造函数,子类的构造方法的第一条语句就是调用父类的没有参数的构造方法,如果你没有写出这条语句java虚拟机就会默认的调用,如果你显示的写了这条语句,就一定要写在构造方法中的第一条语句,不然会报错。
  原理简述:只有在构造方法中调用了父类的构造方法才能继承父类的相关属性和方法,要不然子类从哪里继承父类的属性和方法,在实例化子类的时候又没有和父类有任何关系。
  子类的构造函数默认调用和这个构造函数参数一致的父类构造函数,除非在此子类构造函数的第一行显式调用父类的某个构造函数。
  1. //类Example1:

  2.   class father{

  3.   int x=0,y=0;

  4.   father(){

  5.   System.out.println("now is in father's constructor");

  6.   }

  7.   father(int x,int y){

  8.   this.x=x;

  9.   this.y=y;

  10.   }

  11.   public void print(){

  12.   System.out.println("x="+x+";y="+y);

  13.   }

  14.   }

  15.   class son extends father{

  16.   son(){

  17.   System.out.println("now is in son's constructor");

  18.   }

  19.   son(int x,int y){

  20.   super(x,y);//改变x,y,的值,若无super(x,y),则默认调用father()

  21.   }

  22.   public void print(){

  23.   super.print();

  24.   System.out.println("my name is son!");

  25.   }

  26.   }

  27.   public class Example1 {

  28.   public static void main (String[] args){

  29.   son s=new son();//实例化构造的时候从父类开始调用

  30.   s.print();//此处不是构造,是调用

  31.   son f=new son(10,20);

  32.   f.print();

  33.   }

  34.   }
  35.   
  36.   /***运行结果:

  37.   now is in father's constructor
  38.   now is in son's constructor
  39.   x=0;y=0
  40.   my name is son!
  41.   x=10;y=20
  42.   my name is son!*/
  43.   //类Example2:
  44.  class father{
  45.   int x=0,y=0;
  46.   father(){
  47.   System.out.println("now is in father's constructor");
  48.   }
  49. father(int x,int y){
  50.   this.x=x;
  51.   this.y=y;
  52.   }
  53.   public void print(){
  54.   System.out.println("x="+x+";y="+y);
  55.   }
  56.   }
  57.   class son extends father{
  58.   son(){
  59.   System.out.println("now is in son's constructor");
  60.   }
  61.   son(int x,int y){
  62.   //改变x,y,的值
  63.   System.out.println("s213");
  64.   }
  65.   public void print(){
  66.   //引用父类的print函数
  67.   System.out.println("my name is son!");
  68.   }
  69.   }
  70. public class Example2 {
  71.   public static void main (String[] args){
  72.   son s=new son();//实例化构造的时候从父类开始调用
  73.        s.print();//此处不是构造,是调用, oh,yeah!
  74.   son f=new son(10,20);//先调用父类的father(){System.out.println("now is in }
  75.   //而不是father(int x,int y){this.x=x;this.y=y;}
  76.   f.print();
  77.   }
  78.  }
  79.    /***运行结果
  80.  now is in father's constructor
  81.      now is in son's constructor
  82.      my name is son!
  83.       now is in father's constructor
  84.        s213
  85.     对比这两个类的注释和结果相信你就会明白了。*/
复制代码

0 个回复

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