Java学习之构造器

发布于:2022-10-29 ⋅ 阅读:(410) ⋅ 点赞:(0)

目录

一、基本介绍

二、使用细节

三、练习题目

题目:

我的代码

错误:

改进之后


一、基本介绍

构造器的作用:完成对象的属性初始化

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;
	}
}


网站公告

今日签到

点亮在社区的每一天
去签到