【注意,本人小白一个,以下是个人根据教程的理解,如有疑惑,出错的地方,希望大家能够留言指出来,相互学习进步。】
构造函数
对象在创建的时候会默认调用一个函数,这个函数会初始化对象,这个函数就是构造函数。如果在对象中已经有一个自己定义的构造函数,则系统默认的构造函数将会失效,从而去调用对象里面的构造函数。在看教程和看其他博客上介绍构造函数的时候,有个博客用一个比喻让我对构造函数有深刻的印象,原文是“我们人出生的时候,有些人一出生之后再起名字的,但是有些人一旦出生就已经起好名字的。(博客地址)”看到这个比喻,我感受很大,构造函数就像是起名字,小孩子出生前起名字,我个人理解是自己提前定义好了构造函数,小孩子出生后,起名字前,有短空白期,而这段空白期,我们会根据小孩子的性别确定一个大家都有的“名字”,比如:“男孩子”、“女孩子”,这个就像是调用系统的构造函数。虽然这个比喻也不是很恰当,但是我觉得能够初步的理解“构造函数”是什么,这就行了,要想深入的了解,还是需要代码的理解,官方的介绍。
下面是根据教程的个人理解。
在没有自己设置构造函数的时候,调用系统的构造函数,给对象的实例变量初始化的值分别是:所有的数字变量设为 0,把所有的 boolean 型变量设为 false,把所有的对象变量都设为 null。
Human(){
name=null;
age=0;
sex=null;
addr=null;
}
以上是系统默认的构造函数,
下面验证:
class Human {
String name;
String sex;
int age;
String addr;
void work() {
System.out.println("我在工作");
}
void eat() {
System.out.println("我在吃饭");
}
}
public class MethodDemo {
public static void main(String[] args) {
// 创建一个 zhangsan 对象
Human zhangsan = new Human();
// 打印出 zhangsan 的属性的默认值
class Human {
// 属性
String name;
String sex;
int age;
String addr;
// 构造方法
public Human() {
name = null;
age = 0;
sex = null;
addr = null;
}
// work 方法
void work() {
System.out.println("我在工作");
}
// eat 方法
void eat() {
System.out.println("我在吃饭");
}
}
System.out.println("姓名默认值" + zhangsan.name);System.out.println("性别默认值" + zhangsan.sex);System.out.println("年龄默认值" + zhangsan.age);System.out.println("地址默认值" + zhangsan.addr);}}
运行的结果是:
姓名默认值 null
性别默认值 null
年龄默认值 0
地址默认值 null
这里要说一下,构造函数有个特点,它的名字必须跟类名相同,并且没有返回类型。上面的系统默认的构造函数就是一个简单的构造函数格式。
在类中,系统的构造函数是不显示出来的,其实我们写的类不是完整的类(刚开始),一个完整的类是:
class Human {
// 属性
String name;
String sex;
int age;
String addr;
// 构造方法,public是访问权限
public Human() {
name = null;
age = 0;
sex = null;
addr = null;
}
// work 方法
void work() {
System.out.println("我在工作");
}
// eat 方法
void eat() {
System.out.println("我在吃饭");
}
}
当然,在创建对象的时候,想指定初始化的值,就要自定义自己的构造函数了。
public Human(String hName,String hSex,int hAge,String hAddr){
name=hName;
sex=hSex;
age=hAge;
addr=hAddr;
}
这时候,创建对象的格式就是:
Human zhangsan=new Human("张三","男",25,"中国北京");
如果是这种 Human zhangsan=new Human(); 的话,没有参数传入构造函数中,会报错,这个要注意一下。
构造函数也有重载的功能,在不同情况下,传入构造函数的参数内容不同,调用的构造函数也就不一样了,构造函数的重载和方法的重载也是类似的。
例子:
class Human {
String name;
String sex;
int age;
String addr;
public Human() {
name = null;
age = 0;
sex = null;
addr = null;
}
//只传入的hName、hSex两个构造参数调动此构造参数
public Human(String hName, String hSex) {
name = hName;
sex = hSex;
}
//传入全部的参数,调用这个构造函数
public Human(String hName, String hSex, int hAge, String hAddr) {
name = hName;
sex = hSex;
age = hAge;
addr = hAddr;
}
void work() {
System.out.println("我在工作");
}
void eat() {
System.out.println("我在吃饭");
}
}
实现测试:
public class MethodDemo {
public static void main(String[] args) {
Human zhangsan=new Human();
Human qq=new Human("青青","女");
Human lisi=new Human("李四","男",20,"中国上海");
System.out.println("张三的信息:");
System.out.println(" 姓 名 :"+zhangsan.name+"\n 性 别 : "+zhangsan.sex+"\n 年 龄 :"+zhangsan.age+"\n 地址:"+zhangsan.addr);
System.out.println("青青的信息:");
System.out.println("姓名:"+qq.name+"\n 性别:"+qq.sex+"\n 年龄:"+qq.age+"\n 地址:"+qq.addr);
System.out.println("李四的信息:");
System.out.println("姓名:"+lisi.name+"\n 性别:"+lisi.sex+"\n 年龄:"+lisi.age+"\n 地址:"+lisi.addr);
}
}
运行结果:
张三的信息:
姓名:null
性别:null
年龄:0
地址:null
青青的信息:
姓名:青青
性别:女
年龄:0
地址:null
李四的信息:
姓名:李四
性别:男
年龄:20
地址:中国上海
这里java有个重要的功能,构造函数可以调用其他的构造函数,
class Human {
String name;
String sex;
int age;
String addr;
public Human() {
name = null;
age = 0;
sex = null;
addr = null;
}
public Human(String hName, String hSex) {
name = hName;
sex = hSex;
System.out.println("第二个构造函数被调用");
}
public Human(String hName, String hSex, int hAge, String hAddr) {//全部参数传入,但是只有age、addr定义了,
this(hName, hSex);//通过this关键字调用第二个构造函数,this关键字目前不知道什么意思,今后涉及在讨论
age = hAge;
addr = hAddr;
System.out.println("第三个构造函数被调用");
}
void work() {
System.out.println("我在工作");
}
void eat() {
System.out.println("我在吃饭");
}
}
实例演示:
public class MethodDemo {
public static void main(String[] args) {
Human lisi = new Human("李四", "男", 20, "中国上海");//这个是全部的参数传入构造函数
System.out.println("李四的信息:");
System.out.println("姓名:" + lisi.name + "\n 性别:" + lisi.sex + "\n 年龄:"+ lisi.age + "\n 地址:" + lisi.addr);
}
}
运行的结果是:
第二个构造函数被调用
第三个构造函数被调用
李四的信息:
姓名:李四
性别:男
年龄:20
地址:中国上海
------end------
目前还有个【this】关键字是未知的只是,今后涉及到后才做讨论。