9.9 构造函数
对于一个新定义的类,我们之所以能够用类似于这样的语句:
Stduent stu=new Stduent();
来声明一个新的对象,其实是调用了一个函数,这个函数叫做构造函数。
什么是构造函数呢,有什么作用呢?
构造函数的作用是给新创建的对象分配内存,初始化属性的值。
对于分配内存,我们不用做什么,编译器已经做好了,我们要自己写的是后面的那个:初始化属性。事实上,你就算是一个这样的类,里面什么都没有:
而New后面的Chapter()就是编译器添加的构造函数。这是一个没有参数的构造函数。
现在我们来添加一个带一个参数的构造函数。我们以这个类为例子:
c的id属性赋值为158
构造函数有以下特点:
1.函数必须和类名字一样,大小写也一样
2.函数没有返回类型,void也不可以写
3.构造函数只要参数不一样,可以有多个,参数的类型不同、参数个数不同可视为另一个函数。关于这点,在重载方法里有详细介绍。
4.只要是构造函数,编译器就会插入分配内存的代码,而这段代码我们是看不到的,也无需关心的。
5.如果类里面没有任何构造函数,编译器会自动生成一个无参数的构造函数;如果类里面已经有构造函数,那么编译器不会生成无参数的构造函数。(你无我生成,你有我不管)
关于这点,我们用代码来说明:
看这段代码
Stduent stu=new Stduent();
来声明一个新的对象,其实是调用了一个函数,这个函数叫做构造函数。
什么是构造函数呢,有什么作用呢?
构造函数的作用是给新创建的对象分配内存,初始化属性的值。
对于分配内存,我们不用做什么,编译器已经做好了,我们要自己写的是后面的那个:初始化属性。事实上,你就算是一个这样的类,里面什么都没有:
public class Chapter{}
编译器也自动给你添加了一个没有参数的构造函数,这个自动添加的构造函数,使得你可以这样写:Chapter c=new Chapter();
即使这个类貌似什么“内容”都没有而New后面的Chapter()就是编译器添加的构造函数。这是一个没有参数的构造函数。
现在我们来添加一个带一个参数的构造函数。我们以这个类为例子:
public class Chapter {private int id;private String code;private String name;private String content;private String parentCode;}
假设id值是任何对象都必须要有的值,它很重要。那么我们可以写一个这样的构造函数:public class Chapter {private int id;private String code;private String name;private String content;private String parentCode;public Chapter(int id){this.id=id;} }
这个构造函数需要一个参数,用来设置id值。那么新生成一个对象的时候,就可以这样调用了:Chapter c=new Chapter(158);
c的id属性赋值为158
构造函数有以下特点:
1.函数必须和类名字一样,大小写也一样
2.函数没有返回类型,void也不可以写
3.构造函数只要参数不一样,可以有多个,参数的类型不同、参数个数不同可视为另一个函数。关于这点,在重载方法里有详细介绍。
4.只要是构造函数,编译器就会插入分配内存的代码,而这段代码我们是看不到的,也无需关心的。
5.如果类里面没有任何构造函数,编译器会自动生成一个无参数的构造函数;如果类里面已经有构造函数,那么编译器不会生成无参数的构造函数。(你无我生成,你有我不管)
关于这点,我们用代码来说明:
public class Chapter{}
这个类没有构造方法,但是仍然可以使用Chapter c=new Chapter();来声明一个对象。这是因为编译器为你生成了一个无参数的构造函数,让你可以生成对象。这就是所谓“你无我生成”。看这段代码
public class Chapter {private int id;private String code;private String name;private String content;private String parentCode;public Chapter(int id){this.id=id;} }
这里面有一个带一个参数的构造函数,于是你可以用Chapter c=new Chapter(12);这样的代码来定义一个对象,但是!上面这个类,你已经不能使用Chapter c=new Chapter();这个无参数的构造函数了,因为这个是编译器在你没有构造函数的时候为你生成的,一旦你有构造函数,那么编译器就不再为你生成构造函数了,如果你想要无参数构造函数,那么必须要这样写:public class Chapter {private int id;private String code;private String name;private String content;private String parentCode;public Chapter(int id){this.id=id;} public Chapter(){}}
看上去似乎很多余,public Chapter(){}是一个什么内容也没有函数,但只有这样写了,你就可以调用Chapter c=new Chapter();无参数构造函数来生成对象。