类被实例化时会自动调用类的构造方法,构造方法需满足如下要求:
(1)方法名必须与类名称完全相匹配;
(2)构造方法不需要返回类型;
(3)构造方法不能被static、final等关键字修饰,且不能有return返回语句。
下面的代码使用new运算符实例化Fruits类,apple是Fruits类的实例化对象。
Fruits apple = new Fruits("80%”, “60%”, ”30%”);
使用new运算符实例化Fruits对象时,系统首先为要创建的对象分配内存空间,然后调用类的构造方法初始化类成员属性或类成员变量,最后返回对象实例的引用给apple。
构造方法也分为有参和无参,Fruits类的构造方法属于有参构造方法,调用有参构造方法时,需要传入相对应的参数。无参构造方法则无需传入参数。下面分别讨论无参和有参构造方法。
1、无参构造方法
无参构造方法又分为隐式无参构造方法和显式无参构造方法。
隐式无参构造方法
在定义类的时候,如果没有给类定义一个构造方法,Java编译器在编译时会默认提供一个隐式的构造方法,它没有任何参数,并且有一个空的方法体。
例如,PersonSample类中隐含一个无参构造方法,在main方法中可以通过new关键字来调用此默认的构造方法,PersonSample类代码如下:
/**
* @Title: PersonSample.java
* @Package sample
* @Description:Java基础知识课程案例
* @author 编程训练营
* @date
* @version V1.0
*/
package sample;
/**
* @ClassName: PersonSample
* @Description: 类(构造方法)案例
* @author 编程训练营
* @date
*
*/
public class PersonSample {
//声明名称属性,并被初始化为"张三"
private String name = "张三";
//声明年龄属性,并被初始化为22
private int age = 22;
//定义一个方法,public是修饰符,void表示没有返回值
public void tell() {
System.out.println("姓名:" + name + ",年龄:" + age) ;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}PersonSample代码见PbaseUnit13项目sample包下PersonSample类。
虽然PersonSample类没有提供显示的构造方法,使用new运算符仍然可以实例化PersonSample类为person对象,这是因为Java编译器在编译时会默认提供一个隐式的构造方法。
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建person对象,调用系统提供的一个隐式无参构造方法
PersonSample person = new PersonSample ();
person.tell();
}显式无参构造方法
隐式无参构造方法是由系统提供的,无法修改其内容。但有时需要在调用这个构造方法时初始化类成员属性或执行一些操作,要实现这个需求,就需要为它定义一个显式无参构造方法,修改上述代码如下:
/**
* @Title: ModifyPersonSample.java
* @Package sample
* @Description: Java基础知识课程案例
* @author 编程训练营
* @date
* @version V1.0
*/
package sample;
/**
* @ClassName: ModifyPersonSample
* @Description: 类(构造方法)案例
* @author 编程训练营
* @date 2019年12月7日
*
*/
public class ModifyPersonSample {
//声明名称属性,并被初始化为"张三"
private String name;
//声明年龄属性,并被初始化为22
private int age;
//定义一个显示构造方法
public ModifyPersonSample()
{
this.name = "张三";
this.age = 22;
}
//定义一个方法,public是修饰符,void表示没有返回值
public void tell() {
System.out.println("姓名:" + name + ",年龄:" + age) ;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}ModifyPersonSample代码见PbaseUnit13项目sample包下ModifyPersonSample类。
ModifyPersonSample提供了显示的构造方法,在构造方法中对变量成员name和age进行初始化操作。使用new运算符实例化ModifyPersonSample类为person对象时,构造方法被调用,person对象的成员变量被初始化。
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建person对象,调用系统提供的一个隐式无参构造方法
ModifyPersonSample person = new ModifyPersonSample ();
person.tell();
}
}2、显示有参构造方法
构造并初始化对象是构造方法的作用,所以有时需要给这个方法传入一些参数,定义一个显示的有参构造方法。例如:
//定义一个显示有参构造方法
public ModifyPersonSample (String instrName,int innAge)
{
this.name = instrName;
this.age = innAge;
}下面为ModifyPersonSample类增加有两个参数的显式构造方法,为查阅案例代码方便起见,在PbaseUnit13项目sample包下新建NewPerson类。修改后的代码如下:
/**
* @Title: NewPerson.java
* @Package sample
* @Description: Java基础知识课程案例
* @author 编程训练营
* @date
* @version V1.0
*/
package sample;
/**
* @ClassName: NewPerson
* @Description: 类(构造方法)案例
* @author 编程训练营
* @date
*
*/
public class NewPerson {
//声明名称属性,并被初始化为"张三"
private String name;
//声明年龄属性,并被初始化为22
private int age;
//定义一个显示有参构造方法
public NewPerson(String instrName,int innAge)
{
this.name = instrName;
this.age = innAge;
}
//定义一个方法,public是修饰符,void表示没有返回值
public void tell() {
System.out.println("姓名:" + name + ",年龄:" + age) ;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}NewPerson提供了显示的带参数的构造方法,变量成员name和age由构造方法传入的参数进行初始化。使用new运算符实例化ModifyPersonSample类为person对象时,调用构造方法时需要传入相应的参数。
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建person对象,调用系统提供的一个隐式无参构造方法
NewPerson person = new NewPerson ("张三",22);
person.tell();
}
}构造方法和方法的类似之处在于它们都包含可执行代码,区别在于,只有当Java类实例化时才执行构造方法。构造方法通常包含类属性初始化代码,从严格意义上说,构造方法并不是方法,因为它不会返回任何值。