面向对象(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永远不会再提供无参的构造方法
如果我们将无参构造方法删去,只保留带参构造方法,那么系统就会报错

浙公网安备 33010602011771号