一、什么是构造方法,有什么用?
构造方法是一种比较特殊的方法,通过构造方法可以完成对象的创建,以及实例变量的初始化。换句话说:构造方法是用来创建对象,同时给对象属性赋值的。
二、构造方法语法结构和规则
[修饰符列表] 构造方法名(形式参数列表){
构造方法体;
}
例如:
public class Student{
int no;// 学号
String name;// 姓名
int age;// 年龄
public Student(){//无参的构造方法
}
public Student(int no,String name,int age){//有参的构造方法
}
}
规则:
第一:构造方法名和类名必须一致。
第二:构造方法不需要指定返回值类型,也不能写void,写上void表示普通方法,就不是构造方法了。
为了区别普通方法,看一下普通方法结构:
[修饰符列表] 返回值类型 方法名(形式参数列表){
方法体;
}
public class Student{
int no;// 学号
String name;// 姓名
int age;// 年龄
public void Student(){//这里就是普通方法
}
}
三、构造方法的使用
1.当一个类中没有提供任何构造方法时,系统会默认提供一个无参构造方法,这个无参构造方法叫做缺省构造器。
public class Student{
int no;// 学号
String name;// 姓名
int age;// 年龄
}
public class ConstructorTest01 {
public static void main(String[] args){
// 创建Student类型的对象
Student s1 = new Student();//new Student()这里就调用了系统自动提供的无参构造方法,创建对象。
System.out.println(s1); //系统会分配对象内存地址Student@7ef20235
}
}
2.当一个类中手动提供了构造方法,那么系统将不再默认提供构造方法(建议将无参构造手动写出来,养成习惯)
public class Student{
int no;// 学号
String name;// 姓名
int age;// 年龄
public Student(int n){//有参数的构造方法
no = n;
}
}
public class ConstructorTest01 {
public static void main(String[] args){
// 创建Student类型的对象
Student s1 = new Student();//调用无参构造函数
System.out.println(s1);
}
}
此时会报错,原因你调用的是无参构造函数创建对象,而你在Student方法中有了一个有参构造方法,系统就不会自动给无参构造函数。
此时解决方法是有两个的:
(1)在Student类手写无参构造方法。
public class Student{
int no;// 学号
String name;// 姓名
int age;// 年龄
public Student(){//无参构造函数
}
public Student(int n){//有参数的构造方法
no = n;
}
}
public class ConstructorTest01 {
public static void main(String[] args){
// 创建Student类型的对象
Student s1 = new Student();//此时调用的是手写的无参构造方法
System.out.println(s1);
}
}
(2)在主程序中调用手写的有参构造方法。
public class Student{
int no;// 学号
String name;// 姓名
int age;// 年龄
public Student(int n){//有参数的构造方法
no = n;
}
}
public class ConstructorTest01 {
public static void main(String[] args){
// 创建Student类型的对象
Student s1 = new Student(123);//调用了手写的有参构造方法
System.out.println(s1);
}
}
3.无参构造方法和有参构造方法都可以调用。
Student x = new Student();//无参构造函数
Student y = new Student(123);//有参构造函数
4.构造方法支持重载,在一个类中构造方法可以有多个,并且构造方法名字必须一致,即类名。(方法重载:在同一类中,方法名相同,参数列表不同。)
package com.lkc.constructor;
public class Student{
int no;// 学号
String name;// 姓名
int age;// 年龄
public Student(){//无参的构造方法
System.out.println("调用了无参构造方法");
}
public Student(int no){//有参数的构造方法
System.out.println("调用了有参构造方法1");
}
public Student(int no,String name){//有参数的构造方法
System.out.println("调用了有参构造方法2");
}
public Student(int no,String name,int age){//有参数的构造方法
System.out.println("调用了有参构造方法3");
}
}
package com.lkc.constructor;
public class ConstructorTest01 {
public static void main(String[] args){
// 创建Student类型的对象
Student s1 = new Student();
Student s2 = new Student(123);
Student s3 = new Student(123,"马保国");
Student s4 = new Student(123,"马保国",69);
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
System.out.println(s4);
}
}
这里例子可以看出构造方法是支持重载的,为了方便观察,在每个构造方法上加了一个输出语句。com.lkc.constructor是我的包名。
5.对于实例变量来说,只要你在构造方法中没有手动给它赋值,都会统一赋值(例如:int 对应 0,String 对应 null)。
(1)手动赋值
public class Student{
int no;// 学号
String name;// 姓名
int age;// 年龄
public Student(int cno,String cname,int cage){//有参数的构造方法
no = cno;
name = cname;
age = cage;
}
}
public class ConstructorTest01 {
public static void main(String[] args){
// 创建Student类型的对象
Student s1 = new Student(123,"马保国",69);
System.out.println("学号:"+s1.no+" 姓名:"+s1.name+" 年龄:"+s1.age);
}
}
(2)系统手动赋值
public class Student{
int no;// 学号
String name;// 姓名
int age;// 年龄
public Student(){//无参构造方法
}
}
public class ConstructorTest01 {
public static void main(String[] args){
// 创建Student类型的对象
Student s1 = new Student();
System.out.println("学号:"+s1.no+" 姓名:"+s1.name+" 年龄:"+s1.age);
}
}