java学习——30.构造方法举例
构造方法作为初始化成员变量的方法,完全掌握非常重要。
虽然Java虚拟机会自动匹配构造方法,但作为自己写程序的程序猿们,还是要非常熟悉地知道调用的到底是哪一个构造方法。
1、调用默认构造方法
当类中没有构造方法时,将调用默认的构造方法,例题如下:
public class Student {
private String name;
private int st_no;
public void display(){
System.out.println("姓名:"+name);
System.out.println("学号:"+st_no);
}
public static void main(String args[]){
Student s=new Student();
s.display();
}
}
本例没有构造方法,在创建对象时会调用默认的构造方法:public Student();由main方法中new Student()行代码调用。按默认值为成员变量赋初值。本例有两个成员变量:name为String字符串类型,此为引用数据类型,因此初始化为null。 st_no为int类型,被初始化为0。
因此,本列的运行结果为:
· 姓名:null
学号:0
2、调用自已写的构造方法。
当类中定义了构造方法,Java就不提供默认构造方法了,如下例:
本例仅在上例的基础上加了一个构造方法:
public Student(String name,int st_no){
this.name=name;
this.st_no=st_no;
}
其完整代码及运行如下图:
出错了!!!
原因是我们定义了一个构造方法后,在创建实例时就要按照你定义的构造方法来创建实例,而本例我们定义了带有参数的构造方法,但在创建实例时并没有带参数,所示提示错误。
要按下来改正main中创建对象的语句,才能顺利执行。
自定义的构造方法有三种,如上篇所介绍。
(1)不带参
(2)带参
(3)拷贝构造方法
三种的意思并不是说只能有三个构造方法,比如第二种带参,可以是带一个参数,可以是带两个参数,根据类来自定义。
以下例统一说明。
例:学生类、人类及其使用。
本例由三个类组成,关键代码后均有注释。
class people{//人类
private String name;//姓名
public people(){//构造方法
name="张三";
}
public people(String name){//带参构造方法
this.name=name;
}
public people(people p){//拷贝构造方法
this.name=p.name;
}
public void set(String name){//实例方法,修改成员变量的值
this.name=name;
}
public void show(){//实例方法,输出姓名
System.out.println("姓名:"+name);
}
}
class Student {//学生类
private people p;//人类对象p为学生类的成员变量
private int st_no;//学号
public Student(){//构造方法,对p和st_no赋初值
p=new people();//调用people类的不带参构造方法
st_no=123;
}
public Student(String name,int st_no){//构造方法
p=newpeople(name);//调用people类的带参构造方法
this.st_no=st_no;
}
public Student(people p,int st_no){
this.p=newpeople(p);//调用people类的持贝构造方法
this.st_no=st_no;
}
public Student(Student s){//拷贝构造方法
this.p=new people(s.p);//此为深拷贝,调用people类的持贝构造方法
st_no=s.st_no;
}
public void display(){
p.show();//调用people类的实例方法输出姓名
System.out.println("学号:"+st_no);
}
}
public class Student_ex {
public static void main(String args[]){
Student s1=new Student();//调用学生类不带参的构造方法
s1.display();
Student s2=new Student("张熹熹",201800125);//调用学生类带参的构造方法
s2.display();
Student s3=new Student(s2);//调用学生类的拷贝构造方法
s3.display();
people p=new people("lay");
Student s4=new Student(p,2019666);//调用学生类带参的构造方法
s4.display();
}
}
其运行结果如下: