Java中的构造方法

一、什么是构造方法,有什么用?

构造方法是一种比较特殊的方法,通过构造方法可以完成对象的创建,以及实例变量的初始化。换句话说:构造方法是用来创建对象,同时给对象属性赋值的。

二、构造方法语法结构和规则

[修饰符列表] 构造方法名(形式参数列表){

				构造方法体;

}
例如:

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

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值