C++引入了构造函数(constructor,也叫构造器)的概念,它是创建对象时自动调用的一种特殊方法。Java也使用构造函数,还提供了垃圾收集器(garbagecollector),当内存资源不再被使用时会自动释放。构造函数在Java中定义,可以编写以确保每个对象的初始化。但是这里有两个问题:这个构造函数使用的任何名称都可能与类的成员冲突;编译器负责调用构造函数,因此它必须始终知道要调用哪个方法。C++语言采用的方案是定义与类同名的构造函数,Java也采用这种方案。构造函数的作用是创建一个新类的实例。创建对象时,JVM使用构造函数并为其分配内存空间。语法结构classClassName{ClassName(){}}例如,在下面的示例中,我们创建了一个名为ReLearnConstructor的构造函数。在构造函数内部,我们正在初始化hello变量的值。:公共类ReLearnConstructor{Stringhello;//属性//构造函数publicReLearnConstructor(){hello="Hello,Constructor!";}publicstaticvoidmain(String[]args){ReLearnConstructorrc=newReLearnConstructor();系统.out.println(rc.hello);注意创建ReLearnConstructor类对象的语句:ReLearnConstructorrc=newReLearnConstructor();这里,在创建对象时,调用ReLearnConstructor构造函数。并且,hello变量的值被初始化。因此,打印出的hello的值为:ConstructorPurpose构造函数的目的是初始化对象的状态,并为所有声明的属性赋值。如果我们没有自定义的构造函数,JVM会为这些属性分配默认值。基本类型的默认值:整数类型为0。浮点类型为0.0布尔类型为false。对于其他Java引用类型,默认值为null,即不为引用类型的属性赋值。这些默认值可以在后面的代码中查看。构造函数的分类在Java中,构造函数分为三类:无参构造函数、Argument构造函数、Default构造函数、无参构造函数与方法类似,Java的构造函数可以有也可以没有。如果构造函数不接受任何参数,则称为无参数构造函数。比如上面代码中的ReLearnConstructor构造函数是://ConstructorwithoutparameterspublicReLearnConstructor(){hello="Hello,Constructor!";}带参数的构造函数按字面理解,带参数的构造函数称为带参数的构造函数。那么为什么需要使用参数化构造函数呢?一个参数化的构造函数可以用来为不同的对象提供不同的初始化值。例如:publicclassReLearnConstructor{Stringlanguages;//一个接受单个参数的构造函数publicReLearnConstructor(Stringlang){languages=lang;System.out.println("我正在学习"+语言+"语言!");}publicstaticvoidmain(String[]args){//给构造函数传入不同的值ReLearnConstructorrc1=newReLearnConstructor("Java");ReLearnConstructorrc2=newReLearnConstructor("开始");ReLearnConstructorrc3=newReLearnConstructor("Python");}}运行结果:DefaultConstructor如果我们不创建任何构造函数,Java编译器会在程序执行过程中自动创建一个无参构造函数。这个构造函数称为默认构造函数。让我们看一个例子;公共类ReLearnConstructor{字符串语言;诠释;布尔值b;浮动c;publicstaticvoidmain(String[]args){ReLearnConstructorrc=newReLearnConstructor();System.out.println("默认值:");System.out.println("语言:"+rc.languages);System.out.println("a:"+rc.a);System.out.println("b:"+rc.b);System.out.println("c:"+rc.c);}}运行结果:默认值:languages:nulla:0b:falsec:0.0可以看到,我们还没有创建任何构造函数。因此,Java编译器会自动创建一个默认构造函数。上表已验证。原生方法和构造函数的区别构造函数必须和Java中定义的类同名当方法不返回任何值时,构造函数不返回任何类型,而方法有返回类型或void时对象的创建,构造函数只被调用一次,方法可以被调用任意次。如果我们不使用构造函数给属性赋值,我们可以先使用new运算符获取类的实例,使用类的setter方法来设置值,如下:importjava.util。数组;类Person{私有字符串名称;私人年龄;@OverridepublicStringtoString(){returnArrays.asList(name,String.valueOf(age)).toString();}publicvoidsetName(Stringname){this.name=name;}publicvoidsetAge(intage){this.age=age;}//getters}//在JavaclassMain中初始化一个对象{publicstaticvoidmain(String[]args){Personperson=newPerson();person.setName("禹洲1su");person.setAge(22);System.out.println(人);通过构造函数初始化可以省去我们的setter方法。下面的例子:importjava.util.Arrays;类人{私有字符串名称;私人年龄;//构造函数publicPerson(Stringname,intage){this.name=name;这个。年龄=年龄;}publicStringtoString(){returnArrays.asList(name,String.valueOf(age)).toString();}}classSimpleConstructor{publicstaticvoidmain(String[]args){Personperson=newPerson("Yuzhou1su",22);System.out.println(人);}}运行结果:[Yuzhou1su,22]构造函数重载类似于Java方法重载,我们也可以创建两个或多个参数不同的构造函数。这称为构造函数重载。公共类ReLearnConstructor{字符串语言;publicReLearnConstructor(){this.language="Java";}//构造函数publicReLearnConstructor(Stringlanguage){this.language=language;}publicvoidgetName(){System.out.println("编程语言:"+this.language);}publicstaticvoidmain(String[]args){ReLearnConstructorrc1=newReLearnConstructor();ReLearnConstructorrc2=newReLearnConstructor("Python");rc1.getName();rc2.getName();在上面的例子中,我们有两个构造函数:ReLearnConstructor()和ReLearnConstructor(Stringlanguage)。在这里,两个构造函数都使用不同的值初始化变量语言的值。根据创建对象时传递的参数不同,调用不同的构造函数,赋不同的值。运行结果:编程语言:Java编程语言:Python复制构造函数Java中的复制构造方法是使用本类的一个对象构造另一个对象的构造方法。复制构造函数是一种特殊的构造函数,用于创建一个新对象作为现有对象的副本。它只需要一个参数,这将是同一类的另一个实例。我们可以使用this()语句从复制构造函数显式调用另一个构造函数:publicclassReLearnConstructor{privateStringlanguage;//构造函数publicReLearnConstructor(Stringlanguage){this.language=language;}//复制构造publicReLearnConstructor(ReLearnConstructorrc){this.language=rc.language;}publicvoidgetName(){System.out.println("编程语言:"+this.language);}publicstaticvoidmain(String[]args){ReLearnConstructorrc=newReLearnConstructor("Python");ReLearnConstructorcopyOfrc=newReLearnConstructor(rc);rc.getName();copyOfrc.getName();}}运行结果:编程语言:Python编程语言:Python需要复制时当你有一个包含多个成员变量的复杂对象或者想要构建一个现有对象的深拷贝时很有用。匿名内部类除了上述使用构造函数的方法外,另一种初始化对象的方法是使用“双花括号初始化”。这将创建一个只有一个实例初始值设定项的匿名内部类。不推荐使用此方法。导入java.util.Arrays;类Person{私有字符串名称;私人年龄;@OverridepublicStringtoString(){returnArrays.asList(name,String.valueOf(age)).toString();}publicvoidsetName(Stringname){this.name=name;}publicvoidsetAge(intage){this.age=age;}//getters}//在JavaclassMain中初始化一个对象{publicstaticvoidmain(String[]args){//AnonymousclassPersonperson=newPerson(){{//InitializerblocksetName("Yuzhou1su");设置年龄(22);}};System.out.println(人);调用构造函数。创建构造函数的两个规则是:构造函数的名称应该与类的名称相同。Java构造函数不能有返回类型。如果一个类没有构造函数,Java编译器会在运行时自动创建一个默认构造函数。默认构造函数使用默认值初始化实例变量。例如一个int变量将被初始化为0构造函数类型:无参数构造函数-不带参数的构造函数带参数的构造函数.构造函数不能被abstract、static或final修饰。编译器会报如下错误:IllegalmodifierfortheconstructorintypeReLearnConstructor;只允许public,protected&private构造函数可以重载但不能被覆盖,欢迎正在阅读的你加入。
