Java中的构造函数

 
 

构造函数

 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







猜你喜欢

转载自blog.csdn.net/stitch__/article/details/79935216