Java构造器的使用方法

分享到:
           

    在Java程序中,每个类都必须至少有一个构造器(Constructor)。构造器是创建一个类的实例(对象)时需要调用的一个特殊的方法。

    利用构造器可以产生一个类的实例,并且提供了一个地方用来定义创建类的实例时都需要执行的初始化(initialize)代码。构造器的定义语法如下:

    <modifier> <class_name> ( [<argument_list>] )
    {
        [<statements>]
    }

    从上面的语法中可以看出,它和类中的方法定义很类似:可以有访问修饰符modifier、有自己的方法名称、有参数列表、有方法体,因此,可以将构造器当成一个特殊的方法(在许多资料里面,就是将Constructor称为构造方法),这个方法的作用就是用来产生一个类的实例。但是要认识到构造器与普通方法的区别,主要表现在以下3个方面。

    (1)修饰符:和方法一样,构造器可以有任何访问的修饰:public、protected、private或者没有修饰。不同于方法的是,构造器不能有以下非访问性质的修饰:abstract、final、native、static或者 synchronized。

    (2)返回值:方法能返回任何类型的值或者无返回值(void),构造器没有返回值,也不需要void。

    (3)命名:构造器使用和类相同的名字,通常为名词。而方法则不同,通常为描述一个操作的动词。按照习惯,方法通常用小写字母开始,而构造器通常用大写字母开始。

    下面定义一个用来表示"美食"的类Food。

    源文件:Food.java

    public class Food {
        private String food_name ;
        public Food(String name){
            this.food_name = name;
        }
    }

    在Food类中,定义了一个属性food_name,还定义了一个构造器,在构造器中传入一个字符串类型的参数,将参数值赋给属性food_name。此时,就可以通过这个构造器来实例化这个类,如下所示。

    Food myDinner = new Food("pizza");

    这样,就得到了一个food_name名为"pizza"的实例,还可以再创建一个food_name名为"cola"的实例来搭配你的晚餐。

    如果在程序中没有定义任何的构造器,则编译器将会自动加上一个不带任何参数的构造器。默认的构造器不带任何的参数,也没有"方法体"。

    通过上面的示例,在Food类中定义了一个带一个参数的构造器。如果上面的Food类没有定义构造器,则编译器会自动加上一个构造器:

    public class Food {
        private String food_name ;
        public Food(){
        }
    }

    所以,这时可以用下面的语句来实例化这个类:

    Food myDinner = new Food();

    如果在程序中定义了构造器,则编译器将不再提供默认的构造器,即使定义的构造器同样没有参数。如果再使用默认构造器的话,编译器会报错。

    使用Java 构造器中的一些注意事项:

    1.首先要注意的是Java的构造器并不是函数,所以他并不能被继承,这在我们extends的时候写子类的构造器时比较的常见,即使子类构造器参数和父类的完全一样,我们也要写super就是因为这个原因。

    2.构造器的修饰符比较的有限,仅仅只有public private protected这三个,其他的例如任何修饰符都不能对其使用,也就是说构造器不允许被成名成抽象、同步、静态等等访问限制以外的形式。

    3.因为构造器不是函数,所以它是没有返回值的,也不允许有返回值。但是这里要说明一下,构造器中允许存在return语句,但是return什么都不返回,如果你指定了返回值,虽然编译器不会报出任何错误,但是JVM会认为他是一个与构造器同名的函数罢了,这样就会出现一些莫名其妙的无法找到构造器的错误,这里是要加倍注意的。

    4.构造器中一定不要创建自身的实例,否则会造成调用栈溢出错误。这个规则也适用于对象的实例变量,如果对象中有自身的引用,这个引用一定不能在定义中或者构造器中初始化。

    5.如果父类是一个抽象类,那通过调用父类的构造器,也可以将它初始化,并且初始化其中的数据。

    6.如果你要在构造器中调用一个方法时,将该方法声明为private。

    对于这个规则是需要一些说明的,假使你的父类构造器中要调用一个非静态方法,而这个方法不是private的又被子类所重载,这样在实际创建子类的过程中递归调用到了父类的构造器时,父类构造器对这个方法的调用就会由于多态而实际上调用了子类的方法,当这个子类方法需要用到子类中实例变量的时候,就会由于变量没有初始化而出现异常(至于为什么子类中的实例变量没有初始化可以参考上边的实例初始化过程),这是Java不想看到的情况。而当父类构造器中调用的方法是一个private方法时,多态就不会出现,也就不会出现父类构造器调用子类方法的情况,这样可以保证父类始终调用自己的方法,即使这个方法中调用了父类中的实例变量也不会出现变量未初始化的情况(变量初始化总是在当前类构造器主体执行之前进行)

   热点链接:

   1、Java驱动在智能嵌入式设备上更具优势
   2、如何学习嵌入式?
   3、5种常用Android数据存储方法
   4、怎么选择Android培训机构呢?

更多新闻>>