构造函数详解

构造方法

定义

构造器是一种特殊的函数。其主要功能是用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new操作符一起使用在创建对象的语句中。构造器名与类名相同,可重载多个不同的构造器。构造器,构造函数,构造方法三者是一个概念。

特点

  • 构造方法是一种特殊的方法

  • 构造方法的方法名必须与类名相同。

  • 构造方法没有返回类型,也不能定义为void,在方法名前面不声明方法类型。定义格式: [修饰符] 类名 (形参列表){//n条语句}

  • 构造方法的主要作用是完成对象的初始化工作,它能够把定义对象时的参数传给对象的域。

  • 在Java中的每一个类都至少有一个构造方法,也可以定义多个构造方法,如果在定义类时没有定义构造方法,则编译系统会自动插入一个无参数的默认构造器,这个构造器不执行任何代码。

  • 构造方法可以重载,以参数的个数,类型,顺序。

与普通方法的区别

功能和作用的不同

构造器是为了创建类的一个对象,同时可以对属性做初始化。方法仅仅是功能函数。

修饰符

构造器和方法都可以被 public,protected,default,private修饰。但不同于方法的是,构造器不能有以下非访问性质的修饰: abstract, final,static,native,synchronized。

1.构造器不是通过继承得到的,所以没必要把它声明为final
2.一个抽象的构造器将不会在本类中被实现,所以也不能声明为abstract的。
3.构造器总是关联一个对象而被调用,所以把它声明为static是没有意义的。(但其实构造器默认是static的)

返回类型

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

命名

构造器名与类名相同,而方法名则无具体规定。按照习惯,方法通常用小写字母开始,而构造器通常用大写字母开始。构造器通常是一个名词,因为它和类名相同;而方法通常更接近动词,因为它说明一个操作。

调用

构造方法:总是伴随着new操作符的执行被调用,不能对一个已经存在的对象调用构造器来达到重新设置实例域的目的。(构造方法在创建对象时自动执行,一般不能显式地直接调用。)
一般方法:在对象创建之后才可以调用,并且可以调用多次。

"this"的用法

方法中使用this指向正在执行方法的类的对象。(静态方法不能使用this关键字,因为静态方法不属于类的对象,所以this也就没有什么东西去指向)。

构造器中的this指向同一个类中,不同参数列表的另外一个构造器,且调用代码必须放在第一行,否则编译将出错。如果一个类之中存在了多个构造方法的话,并且这些构造方法都使用了this()互相调用,那么至少要保留一个没有调用过其他构造方法的构造方法,以作为程序的出口。

public class Animal {
    String name ;
    int age;

    public Animal(String name) {
        this.name = name;
    }

    public Animal(String name, int age) {
        //调用构造函数
        this(name);
        this.name = name;
        this.age = age;
    }
}

"super"的用法

构造器和方法,都用关键字super指向超类。方法用这个关键字去执行被重写的超类中的方法(没被重写就不用加上super了),构造器使用super去调用超类中的构造器。而且调用代码必须放在第一行,否则编译将出错。如果子类构造器没有显示的调用超类的构造器,则将自动地调用超类默认(无参数)的构造器,如果超类没有不带参数的构造器,并且在子类的构造器中又没有显示地调用超类其他地构造器,则编译将出错。(之所以子类一定要用super调用超类构造器,是因为必须先对父类进行初始化与实例化,才能实现继承,从而吸收已有类的属性和行为并且对新类进行扩展。)

子类的构造方法总是先调用父类的构造方法,如果子类的构造方法没有明显地指明使用父类的哪个构造方法,子类就调用父类不带参数的构造方法。
如果父类没有无参的构造函数,子类需要在自己的构造函数中显示的调用父类的其他构造函数,否则会报错。

public class Animal {
    String name ;
    int age;

    public Animal(String name) {
        this.name = name;
    }

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
public class AnimalTest extends Animal{
    public AnimalTest(String name) {
        //调用无参构造方法
        super(name);
    }
}

继承

构造器是不能被继承的。子类可以继承超类的某些方法。因为如果构造器可以被继承,则子类可以通过继承构造器产生父类对象,这样就会出现子类引用指向父类对象的情况。更何况,每次实例化子类的时候都会“自动运行”它父类的构造函数,子类完全没必要扩展父类的构造函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值