一、引出构造器(constructor)
构造方法又叫构造器(constructor),是类的一种特殊的方法,主要用于完成对新对象的初始化
(对新对象的初始化不是去创建对象,也就是说当使用构造器时,对象已经存在了,但是对象的属性的初始化是由构造器来完成的)
需求:前面我们在创建人类的对象时,是先把一个对象创建好后,再给他的年龄和姓名属性赋值,如果现在我要求,在创建人类的对象时,就直接指定这个对象的年龄和姓名,该怎么做? 这时就可以使用构造器。
二、 基本语法
[修饰符] 方法名(形参列表){
方法体;
}
三、构造器特点
1)构造器的修饰符可以默认
2)构造器没有返回值
3)方法名 和类名字必须一样3
4)参数列表 和 成员方法样的规则
5)在创建对象时,系统会自动调用该类的构造器完成对 对象 的初始化
四、代码案例快速入门了解构造器
现在要求在创建人类的对象时,就直接指定整个对象的年龄和姓名
public class hsp240{
public static void main(String args[]){
//当我们new一个对象时,直接通过构造器指定名字和年龄
//使用构造器时,对象已经存在了,但是对象的属性的初始化是由构造器来完成的
Person p1 = new Person("lmd", 80);
System.out.println("p1的属性如下");
System.out.println("p1对象的属性name" + p1.name);
System.out.println("p1对象的属性age" + p1.age);
}
}
//在创建人类的对象时,就直接指定整个对象的年龄和姓名
//
class Person{
String name;
int age;
//构造器
//1、构造器没有返回值,也不能写void
//2、构造器的名字须与类名一致
//3、(String pName, int pAge)是构造器形参列表,规则与成员方法一样
public Person(String pName, int pAge){
System.out.println("构造器被调用,完成对象属性的初始化");
//初始化属性
name = pName;
age = pAge;
}
}
五、构造器的注意事项和细节
1、一个类可以定义多个不同的构造器,即构造器重载
比如:我们可以给上面代码中的Person类再定义一个构造器,用来创建对象的时候,只指定人 名,不需要指定年龄
public class hsp240{
public static void main(String args[]){
//当我们new一个对象时,直接通过构造器指定名字和年龄
//使用构造器时,对象已经存在了,但是对象的属性的初始化是由构造器来完成的
Person p1 = new Person("lmd",80);
System.out.println("p1的属性如下");
System.out.println("p1对象的属性name" + p1.name);
System.out.println("p1对象的属性age" + p1.age);
Person king = new Person("lmd");
System.out.println("king的属性如下");
System.out.println("king对象的属性name" + king.name);
}
}
//在创建人类的对象时,就直接指定整个对象的年龄和姓名
//
class Person{
String name;
int age;
//第一个构造器
public Person(String pName, int pAge){
System.out.println("构造器被调用,完成对象属性的初始化");
//初始化属性
name = pName;
age = pAge;
}
//第二个构造器
//形参列表与第一个构造器的不同,形成了构造器重载
public Person(String pName){
System.out.println("构造器被调用,完成对象属性的初始化");
//初始化属性
name = pName;
}
}
2、在创建对象时,系统会自动调用该类的构造器完成对 对象 的初始化,但是自己不能去调用
//系统自动调用
Person p1 = new Person("lmd",80);
//但是自己不能调用构造器
//p1.Person();//错误
3、若程序员没有定义构造器,系统会默认给 类 生成一个默认无参构造器(也叫默认构造器)
public class hsp240{
public static void main(String args[]){
Dog d = new Dog();
}
}
class Dog{
//若程序员没有定义构造器,系统会默认给 类 生成一个默认无参构造器(也叫默认构造器)
/*
默认构造器
Dog(){
}
*/
}
4、一旦定义了自己的构造器,默认的构造器就覆盖了,就不能再使用默认的无参构造器,
除非自己显式的定义一下 Dog(){}
public class hsp240{
public static void main(String args[]){
Dog d = new Dog();//这里使用的是默认无参构造器,但此时因为已经定义了一个构造器
//默认构造器被覆盖,这里就会报错
//若仍想使用默认构造器,需要显式地去定义一下
}
}
class Gog{
//若程序员没有定义构造器,系统会默认给 类 生成一个默认无参构造器(也叫默认构造器)
/*
默认构造器
Dog(){
}
*/
//一旦定义了自己的构造器,默认的构造器就覆盖了,就不能再使用默认的无参构造器,
//除非自己显式的定义一下 Dog(){}
public Dog(String dName){
//默认构造器已被覆盖
}
Dog(){//自己显式的定义一下 Dog(){}
}
}
六、练习
1、定义一个无参构造器,利用构造器设置所有人地age属性初始值均为18
2、建一个带pName和pAge两个参数的构造器,使得每次创建Person对象的同时
初始化对象的age属性和name属性
public class hsp243{
public static void main(String args[]){
Person p1 = new Person();
System.out.println("p1的属性如下" + p1.age + " " + p1.name);//18 null
Person p2 = new Person("lmd",22);
System.out.println("p2的属性如下" + p2.age + " " + p2.name);//22 lmd
}
}
class Person{
String name;
int age;
//1、定义一个无参构造器,利用构造器设置所有人地age属性初始值均为18
public Person(){
age = 18;
}
//2、创建一个带pName和pAge两个参数的构造器,使得每次创建Person对象的同时
// 初始化对象的age属性和name属性,
public Person(String pName,int pAge){
name = pName;
age = pAge;
}
}