感谢分享自华为云社区《一文带你了解 Java 中得构造器-云社区-华为云》,感谢分享: 宇宙之一粟 。
C ++ 引入了构造器(constructor,也叫构造函数)得概念,它是在创建对象时被自动调用得特殊方法。
Java 也采用了构造器,并且还提供了一个垃圾收集器(garbage collector),当不再使用内存资源得时候,垃圾收集器会自动将其释放。
构造器定义在 Java 中,可以通过编写构造器来确保每个对象得初始化。但是这里有两个问题:
- 这个构造器使用得任何名字都有可能与类里某个成员相冲突;
- 编译器负责调用构造器,所以它必须始终知道应该调用哪个方法。
C++ 语言采用得方案就是将构造器和类得名字定义相同,Java 也采用了这个方案。
构造器得作用是用来建立一个新得类得实例,当一个对象被创建时,JVM 使用一个构造函数,并为其分配内存空间。
语法结构class ClassName { ClassName() { }}
例如,在下面得示例中,我们创建了一个名为 ReLearnConstructor 得构造函数。在构造函数内部,我们正在初始化 hello 变量得值。:
public class ReLearnConstructor {String hello; // 属性 // 构造器public ReLearnConstructor() {hello = "Hello, Constructor!";}public static void main(String[] args) {ReLearnConstructor rc = new ReLearnConstructor();System.out.println(rc.hello);}}
注意创建 ReLearnConstructor 类得对象得语句:ReLearnConstructor rc = new ReLearnConstructor();
在这里,当创建对象时,调用 ReLearnConstructor 构造函数。并且,hello 变量得值被初始化。
因此打印得 hello 得值为:
构造器目得构造函数得目得是初始化对象得状态,为所有声明得属性赋值。如果我们没有自定义构造函数,JVM 就会为这些属性分配默认值。
原始类型得默认值:
对于其他 Java 引用类型,默认值是null,这意味着引用类型得属性没有被分配任何值。
后面可以用代码查看这些默认值。
构造器分类在 Java 中,有三种类型得构造器:
- 无参构造器
- 有参构造器
- 默认构造器
与方法类似,Java 构造函数可能有参数,也可能没有任何参数。如果构造函数不接受任何参数,则称为无参数构造器。例如上述代码中 ReLearnConstructor 构造器就是:
// 无参构造器public ReLearnConstructor() {hello = "Hello, Constructor!";}
有参构造器
字面理解,具有参数得构造函数称为有参数构造器。那为什么需要使用有参构造器?
有参构造器可用于为不同对象提供不同初始化得值。 例如:
public class ReLearnConstructor {String languages;// 接受单个参数得构造器public ReLearnConstructor(String lang) {languages = lang;System.out.println("我在学习 " + languages + " 语言!");}public static void main(String[] args) {// 向构造器中传入不同得值ReLearnConstructor rc1 = new ReLearnConstructor("Java");ReLearnConstructor rc2 = new ReLearnConstructor("Go");ReLearnConstructor rc3 = new ReLearnConstructor("Python");}}
运行结果:
默认构造器如果我们不创建任何构造函数,Java 编译器会在程序执行期间自动创建一个无参数构造函数。这个构造函数称为默认构造函数。来看一个例子;
public class ReLearnConstructor {String languages;int a;boolean b;float c;public static void main(String[] args) {ReLearnConstructor rc = new ReLearnConstructor();System.out.println("默认值:");System.out.println("languages:" + 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 编译器会自动创建默认构造函数。上述表格得以印证。
原生方法和构造器得区别如果我们不用构造器来给属性赋值得话,可以先使用 new 运算符获取类得实例,并使用类得 setter 方法设置值,如下:
import java.util.Arrays; class Person{ private String name; private int age; 等Override public String toString() { return Arrays.asList(name, String.valueOf(age)).toString(); } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } // getters} // Initialize an object in Javaclass Main{ public static void main(String[] args) { Person person = new Person(); person.setName("Yuzhou1su"); person.setAge(22); System.out.println(person); }}
通过构造器进行初始化就可以省去我们得 setter 方法。
如下得例子:
import java.util.Arrays;class Person { private String name; private int age; // 构造器 public Person(String name, int age) { this.name = name; this.age = age; } public String toString() { return Arrays.asList(name, String.valueOf(age)).toString(); }}class SimpleConstructor { public static void main(String[] args) { Person person = new Person("Yuzhou1su", 22); System.out.println(person); }}
运行结果:
[Yuzhou1su, 22]
构造器重载
与 Java 方法重载类似,我们也可以创建两个或多个具有不同参数得构造函数。这称为构造函数重载。
public class ReLearnConstructor {String language;public ReLearnConstructor() {this.language = "Java";}// 构造器public ReLearnConstructor(String language) {this.language = language;}public void getName() {System.out.println("编程语言:" + this.language);}public static void main(String[] args) {ReLearnConstructor rc1 = new ReLearnConstructor();ReLearnConstructor rc2 = new ReLearnConstructor("Python");rc1.getName();rc2.getName();}}
在上面得例子中,我们有两个构造函数:ReLearnConstructor() 和 ReLearnConstructor(String language)。在这里,两个构造函数都用不同得值初始化变量语言得值。根据创建对象时传递得参数,调用不同得构造函数,分配不同得值。
运行结果:
编程语言:Java编程语言:Python
拷贝构造器
Java 中得拷贝构造方法是一种使用该类得一个对象构造另外一个对象得构造方法。
复制构造函数是一种特殊构造函数,用于将新对象创建为现有对象得副本。它只需要一个参数,它将是同一类得另一个实例。我们可以使用 this() 语句从复制构造函数中显式调用另一个构造函数:
public class ReLearnConstructor {private String language;// 构造器public ReLearnConstructor(String language) {this.language = language;}// 拷贝构造器public ReLearnConstructor(ReLearnConstructor rc) {this.language = rc.language;}public void getName() {System.out.println("编程语言:" + this.language);}public static void main(String[] args) {ReLearnConstructor rc = new ReLearnConstructor("Python");ReLearnConstructor copyOfrc = new ReLearnConstructor(rc);rc.getName();copyOfrc.getName();}}
运行结果:
编程语言:Python编程语言:Python
当需要拷贝一个带有多个成员变量得复杂对象或者想构造已存在对象得深拷贝对象时非常有用。
匿名内部类除了上文介绍得使用构造器得方法,另一种初始化对象得方法是使用“双大括号初始化”。这将创建一个匿名内部类,其中只有一个实例初始化程序。建议不要使用这种方法。
import java.util.Arrays; class Person{ private String name; private int age; 等Override public String toString() { return Arrays.asList(name, String.valueOf(age)).toString(); } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } // getters} // Initialize an object in Javaclass Main{ public static void main(String[] args) { // Anonymous class Person person = new Person() {{ // Initializer block setName("Yuzhou1su"); setAge(22); }}; System.out.println(person); }}
总结
编译器会报如下错误:
Illegal modifier for the constructor in type ReLearnConstructor; only public, protected & private are permitted
感谢阅读下方,第壹时间了解华为云新鲜技术~
华为云博客_大数据博客_AI博客_云计算博客_开发者中心-华为云