- 构造方法:在Java中,任何变量在被使用前都必须先设置初值,如无显式赋值,则编译器会为其进行隐性赋值。Java提供了为类的实例变量赋初值的专门方法(构造方法)。【简单来说,构造方法是用来实现类的实例化(创建对象)。】
- 构造方法,是一种特殊的方法,它是一个与类同名的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法。【构造方法不能通过对象的引用显示的调用,只能创建对象的时候自动调用或者在另一个构造方法的第一行通过this关键字调用】构造方法和其他方法一样也可以重载。
- 构造方法是一种特殊的成员方法,它的特殊性反映在如下几个方面:
- 构造方法作用:(1).创建对象 (2).给实例变量赋值。
- 构造方法定义时名字必须与定义他的类名完全相同,没有返回类型,甚至连void也没有。
- 主要完成对象的初始化工作,构造方法的调用是在创建一个对象时使用new操作进行的。
- 类中必定有构造方法,若不写,系统自动添加无参构造方法。接口不允许被实例化,所以接口中没有构造方法。
- 不能被static、final、synchronized、abstract和native修饰。
- 构造方法在初始化对象时自动执行,一般不能显式地直接调用.当同一个类存在多个构造方法时,java编译系统会自动按照初始化时最后面括号的参数个数以及参数类型来自动一一对应。完成构造函数的调用。(利用方法重载)
- 构造方法分为两种:无参构造方法 有参构造方法
- 构造方法可以被重载。没有参数的构造方法称为默认构造方法,与一般的方法一样,构造方法可以进行任何活动,但是经常将他设计为进行各种初始化活动,比如初始化对象的属性。
- 自定义类中,如果不写构造方法,java系统会默认添加一个无参的构造方法(这个构造方法称为缺省构造器)。如果写了一个有参的构造方法,java系统就不会默认添加一个无参的构造方法, 如果想使用无参的构造方法,就必须手动给出无参构造方法。(建议:一般情况下,我们自定义的类都要手动给出无参构造方法,因为无参构造方法太常用了。)
- 子类继承父类
- 子类的实例化过程
- 构造方法不能被子类继承
- 子类构造方法中,第一行默认是super()
- 因为他继承父类的成员使用,使用前这些成员必须初始化,
- 而他们是父类的成员,所以,必须通过父类进行初始化。
- 所以,会先创建一个父类的对象。
- 当父类没有无参构造方法时
- 必须使用this或者super调用其他的构造方法。
- this()和super()都只能放在构造器的第一行,因此这两个构造方法不能共存在一个构造器。
- 默认是去调用父类的无参构造方法。
- 子类创建对象时,会先去创建父类的对象。
- 构造方法语法结构:
- [修饰符列表] 构造方法名(形式参数列表) { 方法体;}
- 方法调用:
- 普通方法:方法修饰符列表中有static的时候:类名.方法名(实参列表)、方法中修饰符列表中没有static的时候:引用.方法名(实参列表)
- 构造方法: new 构造方法名(实参列表)
- 当创建子类对象时 ,不管使用子类的那个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造方法中用super去指定使用父类的那个构造器完成对父类的初始化工作,否则编译不会通过。
- 构造方法调用执行之后有返回值吗?
- 构造方法虽然不用写返回值类型,但是构造方法有返回值,因为构造方法是用来创建对象的,构造方法执行结束之后返回构造方法所在类的类对象(也可以说返回该对象在堆内存中的内存地址)用一个变量去接收,这个变量叫做对象的引用,且仅此一种返回值类型,所以不用在定义的时候规定返回值类型。【不是所有的调用构造方法之后都返回该类的对象,比如在一个构造方法中调用另一个构造方法,可能是为了为对象的属性赋初始值】
- 在构造方法中“return 值;”这样的语句不需要我们自己手动写。构造方法结束的时候Java程序自动返回值。
- 成员变量之实例变量,属于对象级别的变量,这种变量必须先有对象才能有实例变量。
- 实例变量没有赋值的时候,系统默认赋值,那么这个系统默认赋值是在什么时候完成的那?实在类加载的时候?不是,因为类加载的时候只加载了代码片段,还没来得及创建对象,所以此时实例变量没有初始化。
- 实际上实例变量的内存空间实在构造方法执行过程当中完成开辟的,系统赋默认值的时候也是在构造方法中完成赋值的。
public class User {
String name;
boolean sex;
public User () {}
} 相当于
public class User {
String name;
boolean sex;
public User () {
//红色部分相当于给实例变量赋值,属于隐藏的代码不需要手动编写,系统自动完成。
name = null;
sex = false;
}
}
public class User {
String name;
boolean sex;
public User (String name) {
this.name = name;
}
public User (String name,boolean sex) {
this.name = name;
this.sex = sex;
}
} 相当于
public class User {
String name;
boolean sex;
public User (String name) {
//红色部分相当于给实例变量赋值,属于隐藏的代码不需要手动编写,系统自动完成。
name = null;
sex = false; //系统先赋完默认值
this.name = name; //然后自己写的代码初始化实例变量的话覆盖系统赋的默认值
}
public User (String name, boolean sex) {
//红色部分相当于给实例变量赋值,属于隐藏的代码不需要手动编写,系统自动完成。
name = null;
sex = false;
this.name = name;
this.sex = sex; //然后自己写的代码初始化实例变量的话覆盖系统赋的默认值
}
}