目录
一、基本介绍
构造器的作用:完成对象的属性初始化
eg:
public class Constructor01{
public static void main(String[] args){
Person p1 = new Person("smith", 56);
System.out.println("对象p1的属性信息如下");
System.out.println("对象p1的name=" + p1.name);
System.out.println("对象p1的age=" + p1.age);
}
}
class Person{
String name;
int age;
public Person(String pName, int pAge){
name = pName;//pName=smith被传入构造器中,然后赋给name
age = pAge;
System.out.println("构造器被调用~~,完成对象属性的初始化");
}
}
在创建p1这个对象的时候,就直接指定这个对象的年龄和姓名
分析:
1.构造器没有返回值(也不能写void)
2.构造器名称和类名必须一样
3.(String pName, int pAge)是构造器的形参列表,规则和成员方法的形参列表一样
Person p1 = new Person("smith", 56);//当我们new一个对象的时候,直接通过构造器指定名字和年龄
二、使用细节
1.一个类可以定义多个构造器,即构造器重载
public class ConstructorDetail{
public static void main(String[] args){
Person p1 = new Person("smith", 56);
Person p2 = new Person("tom");
System.out.println("=====对象p1的属性信息如下=====");
System.out.println("对象p1的name=" + p1.name);
System.out.println("对象p1的age=" + p1.age);
System.out.println("=====对象p1的属性信息如下=====");
System.out.println("对象p2的name=" + p2.name);
System.out.println("对象p2的name=" + p2.age);//默认值为0
}
}
class Person{
String name;
int age;
//一个类可以定义多个构造器,即构造器重载
//第一个构造器,指定名字和年龄
public Person(String pName, int pAge){
name = pName;//pName=smith被传入构造器中,然后赋给name
age = pAge;
System.out.println("构造器被调用~~,完成对象属性的初始化");
}
//第二个构造器,只指定人名
public Person(String pName){
name = pName;
}
}
编译运行结果
2.构造器没有返回值(也不能写void)
3.构造器名称和类名必须一样
4.构造器是完成对象的初始化,并不是创建对象
5.在创建对象时,系统自动调用该类的构造器(不需要主动调用)
6.如果程序员没有定义构造器,系统会自动给类生成一个默认的无参构造器,比如Person(){},用javap反编译测试一下
public class ConstructorDetail{
Dog d1 = new Dog();
}
}
class Dog{
//系统自动生成的默认的无参构造器
/*
Dog(){
}
*/
}
用反编译工具javap编译运行的结果
7.一旦自己定义了构造器,默认的无参构造器就被覆盖了,并且不能再使用了;如果想再使用的话需要显式定义
public class ConstructorDetail{
Dog d1 = new Dog();//无法调用系统内默认的无参构造器
}
}
class Dog{
//系统自动生成的默认的无参构造器
/*
Dog(){
}
*/
public Dog(int dAge){//定义了自己的构造器,默认的无参构造器被覆盖
}
}
编译结果
反编译结果:默认无参构造器已经被覆盖了
显式定义之后
public class ConstructorDetail{
public static void main(String[] args){
Dog d1 = new Dog();//调用系统内默认的无参构造器
}
}
class Dog{
//系统自动生成的默认的无参构造器
/*
Dog(){
}
*/
public Dog(int dAge){
}
public Dog(){//显式定义无参构造器
}
}
编译成功
三、练习题目
题目:
在前面定义的 Person 类中添加两个构造器:
第一个无参构造器: 利用构造器设置所有人的 age 属性初始值都为 18
第二个带 pName 和 pAge 两个参数的构造器: 使得每次创建 Person 对象的同时初始化对象的 age 属性值和 name 属性值。
分别使用不同的构造器, 创建对象.
我的代码
public class ConstructorExercise{
public static void main(String[] args){
Person p1 = new Person();
System.out.println("p1的年龄是" + p1.age);
Person p2 = new Person("甄嬛", 27);
System.out.println("p2的名字是" + p2.name + "p2的年龄是" + p2.age);
}
}
class Person{
String name;
int age = 18;
public Person(){
}
public Person(String pName, int pAge){
name = pName;
age = pAge;
}
}
错误:
题目要求:利用构造器设置属性age的初始值是18,我的代码是在属性内直接定义,与题目要求不符
改进之后
public class ConstructorExercise{
public static void main(String[] args){
Person p1 = new Person();
System.out.println("p1的名字是" + p1.name + " p1的年龄是" + p1.age);
Person p2 = new Person("甄嬛", 27);
System.out.println("p2的名字是" + p2.name + " p2的年龄是" + p2.age);
}
}
class Person{
String name;//默认值为null
int age;
public Person(){
age = 18;
}
public Person(String pName, int pAge){
name = pName;
age = pAge;
}
}