覆盖构造函数

本文探讨了Java中构造方法的工作原理,解释了如何通过super()调用父类构造方法,以及如何正确初始化派生类中的新成员变量。
       从技术上说,构造方法是不能被覆盖的。由于它们的名称总是与当前类相同,构造函数是新创建的,而不是继承而来的。在很多时候,这样做是没有问题的;当类的构造方法被调用时,所有超类中特征标与此相同的构造方法也将被调用。因此,类中所有继承而来的部分都将被初始化。
       然而,为类定义构造方法时,可能想修改对象的初始化方式,不但初始化类中新增的变量,而且要修改继承而来的变量的内容。为此,可以显式地调用超类的构造方法,并修改需要修改的变量。
       要调用超类中的常规方法,可以使用super.methodname(arguments)。由于构造方法没有可供调用的方法名,因此采用如下格式:
              super(arg1,arg2,arg3,…);
       注意,Java对super()的用法有特殊的规则:它必须是构造函数定义中的第一条语句。如果构造函数没有显式地调用super(),Java将自动调用:使用不带参数的super()。由于对方法super()的调用必须是第一条语句,因此在覆盖构造函数中,不能像下面这样做:
              if (condition == true)
                     super(1,2,3);
              else
                     super(1,2);
       与在构造方法中使用this()类似,super()将调用直接超类的构造方法(这可能会调用其超类的构造函数,依此类推)。注意,要使super()调用管用,超类中必须有特征标与此相同的构造函数。在编译源文件时,Java编译器会检查这一点。
       不必调用超类中特征标与子类的构造函数相同的构造函数,而只需要为需要初始化的值调用构造函数。实际上,可以创建一个这样的类,即它的构造函数的特征标与任何超类的构造函数都完全不同。
       以下程序是一个名为NamedPoint的类,它是从java.awt包中的Point类派生而来的。Point类只有一个构造函数,该构造函数接受x和y坐标作为参数,并返回一个Point对象。NamedPoint新增了一个实例变量(一个表示名称的字符串),并定义了一个用于初始化x、y和名称的构造函数。
              Import java.awt.Point;
              clsss NamedPoint extends Point{
       String name;
       NamePoint(int x,int y,String name){
       Super(x,y);
       This.name = name;
}
Public static void main(String[] arguments){
       NamedPoint np = new NamedPoint(5,5,”SmallPoint”);
       System.out.println(“x is” + np.x);
       System.out.println(“y is” + np.y);
       System.out.println(“Name is” + np.name);
}
}
       该程序的输出如下:
              x is 5
              y is 5
              Name is SmallPoint
              NamePoint的该构造方法调用Point的构造方法来初始化Point的实例变量(x和y)。虽然自己初始化x和y也很容易,但可能不知道Point在初始化自身时还执行了哪些操作。因此,比较好的办法是将构造方法沿类层次结构向上传递,以确保一切都被正确地设置。 
### 关于 Java Builder 模式是否会覆盖构造函数 Java 中的 **Builder 模式** 并不会真正意义上“覆盖构造函数。实际上,Builder 模式是一种设计模式,用于简化复杂对象的创建过程[^1]。它通过引入一个辅助(即 `Builder` ),使得客户端可以通过链式调用来构建复杂的对象实例。 #### 构造函数的角色 在传统的面向对象编程中,当一个具有多个可选参数或者参数组合非常复杂时,使用普通的构造函数可能会变得难以维护和扩展。此时,Builder 模式的引入并不是为了替代或覆盖原有的构造函数,而是提供了一种更优雅的方式来处理这些复杂场景[^3]。 具体来说,在实现 Builder 模式的过程中,通常会定义私有化的构造函数来防止外部直接实例化目标的对象。取而代之的是,通过静态内部中的公共方法(通常是 `getInstance()` 或似的命名)返回已经初始化完成的目标对象实例[^2]。 以下是基于上述描述的一个典型例子: ```java public class NyPizza { private final Size size; private final Set<Topping> toppings; // 私有的构造函数 private NyPizza(Builder builder) { this.size = builder.size; this.toppings = builder.toppings; } public static class Builder { private final Size size; private Set<Topping> toppings = EnumSet.noneOf(Topping.class); public Builder(Size size) { this.size = size; } public Builder addTopping(Topping topping) { toppings.add(topping); return this; } public NyPizza build() { return new NyPizza(this); } } } ``` 在这个案例里可以看到,虽然存在常规意义上的构造器逻辑,但它仅限于由内部 `Builder` 调用,并未对外暴露给其他部分程序代码访问。 因此可以总结得出结论: - **Builder 模式并不会实际去修改原有构造函数行为;** - 它只是改变了我们如何与该交互的方式——从依赖显式的新建操作转向更加灵活可控的过程导向型接口设计思路下执行对象装配工作流程[^4]。 ### 结论 综上所述,Java 的 Builder 设计模式并未涉及对原生构造函数功能上的替换或是增强动作,其核心价值在于优化大型实体型的属性赋值环节以及提升整体系统的可读性和易用度水平之上。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值