Java 复制构造函数
和C++一样,Java也支持复制构造函数。但是,与C++不同的是,如果你不写自己的构造函数,Java不会创建一个默认的拷贝构造函数。在学习拷贝构造函数之前的一个前提条件是,要深入了解java中的构造函数。下面是一个Java程序的例子,展示了拷贝构造函数的简单用法。
下面是在Java中实现复制构造函数的基本算法
- 定义一个类: 创建一个代表你要管理的对象的类。
- 定义实例变量: 在这个类中,定义代表你要管理的数据的实例变量。
- 定义一个构造函数。为该类定义一个构造函数,以同一类的一个实例作为其参数。这个构造函数将被用来创建一个对象的副本。
- 初始化实例变量 :在构造函数中,用参数对象的值初始化实例变量。
- 使用this关键字来引用实例变量。为了在构造函数中引用类的实例变量,使用this关键字。
- 检查空值 :如果参数对象为空,则返回一个新的类的实例,并为实例变量设置默认值。
- 实现深度复制: 如果实例变量是对象,在构造函数中创建这些对象的新实例,并用参数对象的值来初始化它们。这被称为深度复制,并确保对被复制对象的改变不会影响原始对象。
下面是一个简单类Person的复制构造函数的实现示例
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person(Person another) {
this(another.name, another.age);
}
// Getters and setters for the instance variables
}
例1
// Java Program to Illustrate Copy Constructor
// Class 1
class Complex {
// Class data members
private double re, im;
// Constructor 1
// Parameterized constructor
public Complex(double re, double im)
{
// this keyword refers to current instance itself
this.re = re;
this.im = im;
}
// Constructor 2
// Copy constructor
Complex(Complex c)
{
System.out.println("Copy constructor called");
re = c.re;
im = c.im;
}
// Overriding the toString() of Object class
@Override public String toString()
{
return "(" + re + " + " + im + "i)";
}
}
// Class 2
// Main class
public class Main {
// Main driver method
public static void main(String[] args)
{
// Creating object of above class
Complex c1 = new Complex(10, 15);
// Following involves a copy constructor call
Complex c2 = new Complex(c1);
// Note: Following doesn't involve a copy
// constructor call
// as non-primitive variables are just references.
Complex c3 = c2;
// toString() of c2 is called here
System.out.println(c2);
}
}
输出
Copy constructor called
(10.0 + 15.0i)
例2
// Java Program to Illustrate Copy Constructor
// Class 1
class Complex {
// Class data members
private double re, im;
// Constructor
public Complex(double re, double im)
{
// this keyword refers to current instance itself
this.re = re;
this.im = im;
}
}
// Class 2
// Main class
public class GFG {
// Main driver method
public static void main(String[] args)
{
// Creating object of above class
// inside main() method
Complex c1 = new Complex(10, 15);
// Note: compiler error here
Complex c2 = new Complex(c1);
}
}
输出
现在,在上面的代码中,以对象c1为参数调用函数的那一行将出现错误,因为构造函数中的参数类型是 “double “类型,而传递的内容是 “object “类型。
如果你发现有什么不正确的地方,或者你想分享更多关于上述话题的信息,请写下评论。