面试题答案
一键面试构造函数重载的概念
在Java中,构造函数重载指的是在一个类中可以定义多个构造函数,这些构造函数具有相同的名称(与类名相同),但参数列表不同(参数的个数、类型或顺序不同)。通过构造函数重载,我们可以根据不同的初始化需求,为对象提供多种初始化方式。
举例说明
public class Rectangle {
private int width;
private int height;
// 第一个构造函数,接收两个参数
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
// 第二个构造函数,仅接收一个参数,将正方形的边长设为width和height
public Rectangle(int side) {
this.width = side;
this.height = side;
}
// 第三个构造函数,无参数,默认将width和height设为0
public Rectangle() {
this.width = 0;
this.height = 0;
}
public int getArea() {
return width * height;
}
}
在上述代码中,Rectangle
类有三个构造函数,它们参数列表不同,实现了构造函数重载。可以这样使用:
public class Main {
public static void main(String[] args) {
Rectangle rect1 = new Rectangle(5, 10); // 使用第一个构造函数
Rectangle rect2 = new Rectangle(7); // 使用第二个构造函数
Rectangle rect3 = new Rectangle(); // 使用第三个构造函数
System.out.println("Rectangle 1 area: " + rect1.getArea());
System.out.println("Rectangle 2 area: " + rect2.getArea());
System.out.println("Rectangle 3 area: " + rect3.getArea());
}
}
构造函数重载要点
- 参数列表必须不同:
- 参数个数不同:如上述例子中,有的构造函数接收两个参数,有的只接收一个参数,还有的不接收参数。
- 参数类型不同:例如可以定义
public Rectangle(double width, double height)
和public Rectangle(int width, int height)
两个构造函数。 - 参数顺序不同:
public Rectangle(int width, double height)
和public Rectangle(double width, int height)
也算不同的参数列表。但这种方式可读性较差,应谨慎使用。
- 构造函数名称必须与类名相同:这是Java构造函数的基本规则,所有重载的构造函数都要遵循此规则。
- 不能仅通过返回类型不同来重载构造函数:构造函数没有返回类型,所以不能像普通方法那样通过返回类型来区分不同的构造函数。例如,不能同时存在
public Rectangle(int width, int height)
和private Rectangle(int width, int height)
(仅访问修饰符不同,这在构造函数重载中不被允许)。 - 合理使用
this()
关键字:在构造函数中,可以使用this()
来调用同一个类中的其他构造函数。例如:
public class Circle {
private double radius;
private double x;
private double y;
public Circle(double radius) {
this(radius, 0, 0);
}
public Circle(double radius, double x, double y) {
this.radius = radius;
this.x = x;
this.y = y;
}
}
这样可以避免代码重复,提高代码的可维护性。但要注意,this()
调用必须是构造函数中的第一条语句。