来源 | 社区
作者 | 华为云开发者联盟——宇宙一粒小米
原文链接:
C++引入了构造函数(也称为构造函数)的概念,它是创建对象时自动调用的特殊方法。
Java 还使用构造函数,并且还提供了垃圾收集器 ( ),当内存资源不再使用时,它会自动释放它们。
构造函数定义
在Java中,可以通过编写构造函数来保证每个对象的初始化。 但这里有两个问题:
此构造函数使用的任何名称都可能与该类的成员冲突;
编译器负责调用构造函数,因此它必须始终知道要调用哪个方法。
C++语言采用的解决方案是定义与类同名的构造函数,Java也采用这种解决方案。
构造函数的作用是创建新类的实例。 创建对象时,JVM 使用构造函数并为其分配内存空间。
语法结构
class ClassName {
ClassName() {
}
}
例如,在下面的示例中,我们创建了一个名为 的构造函数。 在构造函数内,我们正在初始化 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);
}
}
注意创建该类的对象的语句:rc = new ();
在这里,当创建一个对象时,就会调用构造函数。 并且,hello变量的值被初始化。
所以打印的hello的值为:
构造函数的目的
构造函数的目的是初始化对象的状态,为所有声明的属性赋值。 如果我们没有自定义构造函数,JVM将为这些属性分配默认值。
基本类型的默认值:
对于其他Java引用类型,默认值为null,这意味着引用类型的属性没有被分配任何值。
这些默认值可以稍后在代码中查看。
构造函数类
在Java中,构造函数分为三种类型:
无参数构造函数
参数化构造函数
默认构造函数
无参数构造函数
与方法一样,Java 构造函数可能有也可能没有任何参数。 如果构造函数不接受任何参数,则称为无参数构造函数。 例如上面代码中的构造函数是:
// 无参构造器
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:null
a:0
b:false
c:0.0
正如您所看到的,我们还没有创建任何构造函数。 因此,Java编译器会自动创建一个默认构造函数。 上表已验证。
原生方法和构造函数的区别
如果我们不使用构造函数给属性赋值,我们可以先使用new操作符获取类的实例,并使用类的方法来设置值,如下:
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 Java
class Main
{
public static void main(String[] args)
{
Person person = new Person();
person.setName("Yuzhou1su");
person.setAge(22);
System.out.println(person);
}
}
通过构造函数进行初始化可以保存我们的方法。
这是一个例子:
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();
}
}
在上面的例子中,我们有两个构造函数:()和()。 这里,两个构造函数都用不同的值初始化变量语言的值。 根据创建对象时传递的参数的不同,调用不同的构造函数并赋值不同的值。
运行结果:
编程语言: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 Java
class 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
【填写问卷,抽奖】
结尾
企业致力于开源是行不通的
这里有最新的开源信息、软件更新、技术干货等。
点击这里↓↓↓记得关注✔star⭐哦~