面向对象(7-1):构造方法

面向对象(7):构造方法

前言

例1:
class Student{              //创建一个学生类
    private String name;    //定义成员变量name
    private int age;        //定义成员变量age
public void setName(String name){ //定义name公共的setName方法
        this.name = name;         //参数名和成员变量名一样,要用this
    }
public String getName(){          //定义name公共的getName方法
        return name;
    }
public void setAge(int age){      //定义age公共的setName方法
    this.age = age;               //参数名和成员变量名一样,要用this
}
public int getAge(){              //定义age公共的getName方法
    return age;
}
public void show(){               //定义一个show方法来打印所有成员变量
    System.out.println("姓名:"+name+",年龄:"+age);
}
}

//测试类
public class StructureDemo1 {
    public static void main(String[] args) {
        Student xx = new Student(); //创建学生对象值
        xx.show();                  //调用show方法来打印所有成员变量
    }
}

            执行结果为:
                    姓名:null,年龄:0

                    Process finished with exit code 0

分析:在例1中,我们并未对成员变量进行赋值,最终会输出系统的默认值null和0。没有赋值,为什么会输出系统的值呢?new出来的new Student()其实在底层调用了一个无参的构造方法

即:构造方法的目的是为对象中的数据进行初始化

构造方法格式:
    (1)方法名与类名相同
    (2)没有返回值类型,连void都没有 Student(){}
    (3)没有具体的返回值
构造方法格式:
例2:
    class Student{              //创建一个学生类
        private String name;    //定义成员变量name
        private int age;        //定义成员变量age

        Student(){		//创建一个构造方法
        System.out.println("这是一个无参构造方法")
        }

    public void setName(String name){ //定义name公共的setName方法
            this.name = name;         //参数名和成员变量名一样,要用this
        }
		......(中间省略)
public class StructureDemo1 {
    public static void main(String[] args) {
        Student xx = new Student(); //创建对象,然后直接运行
      }
   }
   执行结果如下:
           这是一个无参构造方法

           Process finished with exit code 0
           
 由执行结果可知,new出来的Student()调用了一个无参构造方法,才打印出了"这是一个无参构造方法"

由例2可知,我们证明出了内部一直在调用无参的构造方法;回想一下之前,我们其实并为编写过构造方法,所有内部使用的构造方法来自哪里?

例3:
class Student02{

}
public class StructureDemo2 {
    public static void main(String[] args) {
        Student02 y = new Student02();
        System.out.println(y);
    }
}
    执行结果为:
    myself.day12.Student02@1540e19d

    Process finished with exit code 0

在例3中,我们只创建了对象,然后输出,执行结果是地址值,当看到地址值,就说明咱们的对象已经被new了出来;但是在程序中我们并未编写无参的构造方法,

因此我们可以知道Java虚拟机JVM会自动地提供一个无参的构造方法给我们

注意:如果我们自己创建出构造方法,那么JVM就不会再提供默认的无参构造方法了,而且前面学到,方法在同一个类中是可以重载的(方法名一致,参数列表不一样,与返回值无关)

通过方法的重载(和无参方法名一致,参数列表不一样)我们创建一个方法,此时这个方法叫做构造方法
例4:
class Student02{
    private String name;
    private int age;
    Student02(){
        System.out.println("这是我们自己添加的无参构造方法");
    }

    Student02(String name){//通过方法的重载(方法名一致,参数列表不一样)
        this.name = name;  //我们创建了一个带name参数的带参构造方法
    }

    Student02(int age){ //通过方法的重载,我们创建了一个带age参数的带参构造方法
        this.age = age;
    }

    public void show(){
        System.out.println("姓名:"+name+",年龄:"+age);
    }

}
public class StructureDemo2 {
    public static void main(String[] args) {
        Student02 y = new Student02();
        System.out.println(y);

        //创建第二个对象,因为是带参方法,我们可以输入参数
        Student02 n =new Student02("李玉伟");
        n.show();//李玉伟,0

        //创建第三个对象,因为是带参方法,我们可以输入参数
        Student02 a =new Student02(17);
        a.show();//null,17
    }
}
        执行结果为:
                这是我们自己添加的无参构造方法
                myself.day12.Student02@1540e19d
                姓名:李玉伟,年龄:0
                姓名:null,年龄:17

                Process finished with exit code 0

由例4可知,通过方法是重载,我们单独为name和age创建一个带参构造方法,单独创建对象来调用show()方法来输出;但是,输出结果二者却不能在同一行;下面我们使用带参构造方法来将name和age两个参数写在同一个方法内。

例5:
class Student02{			//创建一个类
    private String name;	//定义成员变量name
    private int age;		//定义成员变量age
    
    Student02(){			//创建一个无参构造方法
    }

   Student02(String name,int age){	//创建一个带name和age参数的带参构造方法
        this.name = name;		//又叫做 带所有成员变量参数的带参构造方法
        this.age = age;
   }
    public void show(){		//创建show方法,调用该方法可以输出所有成员变量
        System.out.println("姓名:"+name+",年龄:"+age);
    }
}

public class StructureDemo2 {	//创建一个测试类
    public static void main(String[] args) {
    	//创建一个对象,此括号里可以赋值
        Student02 na = new Student02("李玉伟",18);
        na.show();	//调用show方法
    }
}
        执行结果为:
                姓名:李玉伟,年龄:18

                Process finished with exit code 0

构造方法的作用:

可以在创建对象的时候,给对象的成员变量进行赋值(括号里可以写参数,代表了赋值)

注意:

当我们自己创建了构造方法,无论是无参还是带参,JVM永远不会再提供无参的构造方法

如果我们将无参构造方法删去,只保留带参构造方法,那么系统就会报错

posted @ 2021-12-05 21:58  阿伟宝座  阅读(162)  评论(1)    收藏  举报