构造函数
1.需求:一些事物对应的对象在被创建时就已经有了值,在类中如何完成
则通过构造函数来完成(构造函数是在类中的),对象就是构造出来的,在构造的同时需要完成的动作就定义在函数中————构造函数(不同于一般函数的另一种函数)
2.作用:对对象创建进并且进行初始化
3.在代码中的体现:1.没有返回值类型,对象创建完成就结束。也不用写void 要与一般函数
区别
2.构造函数的函数名要与类的名字一致——是为了初始化类的对象的
值的函数
3.也没有返回值
class person2{
//属性 名字 年龄
private String name;
private int age;
//构造函数/构造器
person2(String n){
name = n;
}
//方法
void Speack(){
System.out.println("My name is "+name+" and "+age+" years old");
}
}
public class ConstructedFunction {
public static void main(String[] args){
person2 p =new person2("XiaoM");//构造器是一种特殊的方法,用构造器来创建并初始化对象,在构造器前加上new
p.Speack();
}
}
类中的构造函数为:
person2(String n){
name = n;
}
测试类中的构建对象的代码为:
person2 p =new person2();
总结:书中讲:要使用对象就要先构造对象,而构造对象就要使用构造器,构造器是一种特殊的方法,构造器的名字必须跟类名一致(这与构造函数的定义说明相符合)
说明:之前所谓的创建对象其实就是在构造对象也调用了构造器,只使在类中没有,(其实之前在类中有一个person 的空参构造器,为编译器在编译的时候默认的)
(其实编译器在编译的时候为我们默认加上去了很多东西,比如main()函数中的return;及其他函数中的return;)
当有构造函数时,就是用你写的构造器,当没有时就是编译器默认的构造器
在这个语句执行时:
person2 p =new person2("XiaoM");
执行顺序:1.new 开辟空间,初始化为默认值
2.然后调用person();这个构造函数传参
3.在函数内:a 的值赋给name(找name 的原则:现在函数中找person()内;然后那个对象调用了他就到那个对象中找)
4.函数执行完,弹栈,
5.创建类类型的变量,将对象的首地址赋值给变量
对象的构建完成
{
在没有构建函数的类中,默认无参数的构建函数对对象的值毫无影响
}
构造函数的的细节 :1.是否需要构造函数,或者需要怎样的构造函数根据具体的要求
2.你的构造函数不同对应的在对象构造时就有不同的构造方式(参数列表不同)
3.构造函数中也有return 用于结束函数
4.当类的构造函数被私有化(private 修饰)除了类里面面的其他地方将无法构造这个类的对象
函数:1.主函数 2.一般函数 3.构造函数
构造函数与一般函数的区别
1.在写法上的不一样,构造函数没有返回值,不写void 函数名与类名一致,
2.定义位置不同:构造函数只能定义在类里
3.运行不同:对象一构造就会调用相应的构造函数
一般方法是对象构造后有需要才调用的
4.有构造函数(用于初始化)依然需要setxxx函数(用于修改)
构造函数之间的调用(与私有化有关)
//构造函数的相互调用(与私有化有关)
//注意构造函数在仅在对象初始化的时候运行
class person3{
//属性
private String name;
private int age;
private person3(int a){//用private 把构造函数封装,使外界程序不能调用它,但类中可以调用
age=a;
}
private person3(String n){
name=n;
}
person3(String n,int a){//没有私有化的构造函数,外界程序可以调用
this(n);//构造函数对构造函数的调用
/*
this :表示当前这个对象(this :new person3())
this(n):new person3(n);向当前对象中传一个字符串型变量
*/
age=a;
}
//行为--一般函数(方法)
void Speack(){
System.out.println("My name is "+name+" and "+age+" years old");
}
}
public class ConstructFModulation {
public static void main(String[] args){
person3 p=new person3("Lizhuzhu",20);
p.Speack();
}
}
小细节:
在构造函数里默认有一个This();----表示当前对象(This 与类类型变量差不多,是引用型,值为对象的首地址)
(与之前讲的name = n 先在函数中着是否有name 这个变量 ,没有则在相应的对象中找,在相应对象中找的依据(寻址)就是This();)
总结:构造函数只有一个的时候,变量赋值在当前对象中这和This();相关,当由多个构造函数,需要构造函数之间的调用时无法知道赋值给哪一个对象,所以要写上This(实参)
调用构造函数要用到关键字This(实参);This();表示的就是当前这个对象
this();----------调用细节:
1.this();——调用必须是在调用的第一行
2.一个构造函数里只能有一个this();(保证在第一行)
3.在类中方法中都有一个保存当前对象this,一般可以省略(在程序中默认有(在变量名没有一样的时候)),但当方法中的局部变量和成员变量名字一致时,不能省略this(赋值找变量的方法依据之前讲的,先在方法中找,是否有变量,然后再去相应的对象中找)
person3 p=new person3("Lizhuzhu",20);
void Speack(){
System.out.println("My name is "+name+" and "+age+" years old");
}
//输出名字Lizhuzhu(有默认的this(),)年龄20
void Speack(){
String name ="MingMing";
System.out.println("My name is "+name+" and "+age+" years old");
}
//输出:名字MingMing 年龄 20;
void Speack(){
String name ="MingMing";
System.out.println("My name is "+this.name+" and "+this.age+" years old");
//输出:名字Lizhuzhu 年龄 20