教程集 www.jiaochengji.com
教程集 >  脚本编程  >  java  >  正文 Java中类的构造器讲解

Java中类的构造器讲解

发布时间:2016-10-18   编辑:jiaochengji.com
教程集为您提供Java中类的构造器讲解等资源,欢迎您收藏本站,我们将为您提供最新的Java中类的构造器讲解资源
类在继承父类时,创建子类对象时,会调用 父类的构造器,本文具体讲解Java中类的构造器的概念,使用,继续,多态等。

Java在使用new创建对象时,会调用其构造器,构造器与方法不同,其没有返回值,且其名字与类名一致,在构造器中,我们可以初始化类的一些fields,这样,当我们创建好对象后,这些对象都有了默认的初始值 。

当我们的类在继承父类的时候,在创建子类对象的时候,首先会调用父类的构造器,实际上,父类的构造器在调用之前,会继续调用Object类的构造器,当Object类的构造器调用完成之后,才调用父类的构造器,依次在调用子类的构造器。这样做的原因是,我们的子类对象的fields的值可能会依赖于父类,因此父类必须将其fields初始化好,一般来说,我们在写子类构造器的时候,无需写

super()

JVM自动帮我们调用父类的默认构造器,但是,当我们不想调用父类的默认构造器的时候,而是想调用其父类带有参数的构造器时,此时,我们需要显示地调用super(arg1,arg2,...),需要注意的是,其调用必须在构造器中首行,其原因也很简单,就是防止我们先调用了子类的构造器。

我们也可以在子类构造器中调用子类的另一个重载的构造器方法,只要使用

this(arg1,arg2,...);


即可,注意,这里的this和在方法中的this不同,方法中的this指的是当前对象,而这里的this指的是指向同一个类中,不同参数列表的另外一个构造器。

当我们重载自己的构造器的时候,JVM不会像之前那样帮我们自动创建一个默认的无参构造器。此时,我们应该自己添加上。

当我们编写下列代码时,

Dog d=new Dog();

实际上,我们在构造器的执行体之前,系统会先为该对象分配内存空间,并为这个对象执行默认初始化,此时对象已经产生了,只是这个对象还不能被外部程序访问,只能在该构造器中通过this来引用它。当构造器的执行体结束后,这个对象作为构造器的返回值被返回,通常还会赋给另一个引用类型的变量,从而让外部程序可以访问该对象。



下面我就来说说java里类的构造器概念。大家知道java作为一门OO语言,和C ,Smalltalk等一样有3个最要害:1。ADT,2。继续,3。多态

当然对于java,类的概念是重中之重,对于类的构造和对象的实现就需要用到构造器。

例如:

<pre class="brush:java;toolbar:false;">class PRofesser(){     private string name;     private int number;     public Professer(string n,int no){     name=n;     number=no;     }     public teach(){}     }</pre>


下面我们要对这个类的对象实例化:Professer p =new Professer()
以上就是构造器的语法了,这里用到了要害字

new
  
讲到这里还没有什么可以困扰我们的地方,那么下面我们将借助有关继续的一些例子来继续阐述构造器问题:

假设:

<pre class="brush:java;toolbar:false">class OldProfesser(){      private string name;      private int number ;      private int age;      public do(){}     } </pre>

  
有人也许会问为什么这个OldProfesser类里面为什么没有定义构造器?其实,java已经我们定义了一个无参数的默认构造器,即OldProfesser(){}
Ok, 到这里为止,没有任何问题,然而,一旦让OldProfesser继续Professer并实例化,编译器就会报错,LOOK:

<pre class="brush:java;toolbar:false">      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();     }</pre>


很抱歉你得到的是一条出错的信息,有人问了,你说OldProfesser的构造器是默认的我才这样写,没错,OldProfesser确实存在这样一个无参的构造器,这样写法换做OldProfesser不做Professer的子类的情况下一定是正确的。
  
你所需要知道的是下面一个规则:
  1。假如一个类没有设置字定义构造器,那么编译器会默认一个无参构造器。
  2。在子类调用构造器时,总是先调用基类的构造器。
  3。假如自定义了构造器,那么默认构造器将不存在。
  
在上例中,OldProfesser调用默认构造器前,编译器自动调用基类Professer的默认构造器,然而,Professer有了自定义构造器,所以默认构造器不存在了,编译器报错…………
那么我们该怎么做呢?像下面这样就OK了。
  

<pre class="brush:java;toolbar:false">    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(){}      }</pre>

    
这就是在子类中显式的调用基类构造器,注重,super必须是{}中的第一个执行语句。其实我们还有另外一种方法,在Professer类里面补充一个消失掉的默认构造器,如下:
   

<pre class="brush:java;toolbar:false">    class Professer(){       private string name;       private int number;       public Professer(string n,int no){       name=n;       number=no;      }       Professe(){}       public teach(){}     }</pre>


值得一提的是构造器方法中,构造器的名称要与类的名称完全相同,包括大小写。

您可能感兴趣的文章:
Java中类的构造器讲解
Java入门:理解构造器 (转)
Java中this与super的用法与对比总结
Java反射(泛型擦除演示)的例子
PHP构造函数的深入理解
Java构造方法的理解
Java学习路径(三)过程篇
Java入门需掌握的30个基本概念
python c 和java的区别有哪些
给所有刚学JAVA以及常来此版的兄弟

[关闭]
~ ~