黑马程序员技术交流社区

标题: 关于构造器的问题 [打印本页]

作者: 蒙奇.D.路飞    时间: 2014-5-14 16:39
标题: 关于构造器的问题
看视频关于构造器,我有点蒙,子类的构造器里都隐藏了哪些东西 在创建子类的对象时 是怎么初始化的?我知道里面有父类的构造器 但是还有什么构造代码块什么的,我就有些蒙了
作者: 张然龙    时间: 2014-5-16 08:16
初始化过程我跟你说一下吧:

父类静态代码块 --> 子类静态代码块 --> 父类构造代码块 --> 父类构造函数 --> 子类构造代码块 --> 子类构造函数

记住,凡是静态全部优先初始化,因为在加载进内存就自动初始化,不能人为干预。

然后是父类初始化优先于子类初始化。

构造代码块优先于构造函数!!
作者: 蒙奇.D.路飞    时间: 2014-5-16 20:56
张然龙 发表于 2014-5-16 08:16
初始化过程我跟你说一下吧:

父类静态代码块 --> 子类静态代码块 --> 父类构造代码块 --> 父类构造函数 -- ...

哦哦 很清晰
作者: 墨香    时间: 2014-5-17 23:06
当然对于java,类的概念是重中之重,对于类的构造和对象的实现就需要用到构造器。
  例如:class PRofesser(){
    private string name;
    private int number;
    public Professer(string n,int no){
    name=n;
    number=no;
    }
    public teach(){} 
   }
  下面我们要对这个类的对象实例化:Professer p =new Professer()
  以上就是构造器的语法了,这里用到了要害字
  new
  
  讲到这里还没有什么可以困扰我们的地方,那么下面我们将借助有关继续的一些例子来继续阐述构造器问题:
  假设:class OldProfesser(){
     private string name;
     private int number ;
     private int age;
     public do(){}
    } 
         
  有人也许会问为什么这个OldProfesser类里面为什么没有定义构造器?其实,java已经我们定义了一个无参数的默认构造器,即OldProfesser(){}
  Ok, 到这里为止,没有任何问题,然而,一旦让OldProfesser继续Professer并实例化,编译器就会报错,LOOK:
     class OldProfesser extends Professer(){
       private string name;
       private int number ;
       private int age;
     
       public do(){}
    public static void mian(string[] args){
       OldProfesser o=new OldProfesser();
    }
  很抱歉你得到的是一条出错的信息,有人问了,你说OldProfesser的构造器是默认的我才这样写,没错,OldProfesser确实存在这样一个无参的构造器,这样写法换做OldProfesser不做Professer的子类的情况下一定是正确的。
  
    你所需要知道的是下面一个规则:
  1。假如一个类没有设置字定义构造器,那么编译器会默认一个无参构造器。
  2。在子类调用构造器时,总是先调用基类的构造器。
  3。假如自定义了构造器,那么默认构造器将不存在。
  
   在上例中,OldProfesser调用默认构造器前,编译器自动调用基类Professer的默认构造器,然而,Professer有了自定义构造器,所以默认构造器不存在了,编译器报错…………
    那么我们该怎么做呢?像下面这样就OK了。
         
    class OldProfesser extends Professer(){
        private string name;
        private int number;
        private int age;
        Oldprofesser(string n,int no,int age){
        super(n,no);
        this.age=age;
        }
        public do(){}
     }
           
     这就是在子类中显式的调用基类构造器,注重,super必须是{}中的第一个执行语句。其实我们还有另外一种方法,在Professer类里面补充一个消失掉的默认构造器,如下:
   
    class Professer(){
      private string name;
      private int number;
      public Professer(string n,int no){
      name=n;
      number=no;
     }
      Professe(){}
      public teach(){} 
   }
   
  值得一提的是构造器方法中,构造器的名称要与类的名称完全相同,包括大小写。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2