上一篇地址:整理好了!2024年最常见 100 道 Java基础面试题(十三)-CSDN博客
二十七、构造器可以被重写和重载吗?
在Java中,构造器是用于创建类实例时初始化对象的特殊方法,它们有一些独特的特性。
构造器是否可以被重写(Override)
- 答案:不可以。
- 原因:重写是针对具有相同方法签名的方法来说的,而构造器的名称必须与类名完全相同,且没有返回类型(连void也不行)。由于子类和父类的构造器名称不相同(它们与各自的类名相同),它们无法匹配父类的构造器名称,因此无法被重写。
构造器是否可以被重载(Overload)
- 答案:可以。
- 原因:构造器可以被重载,这意味着一个类可以有多个具有不同参数列表的构造器。重载基于不同的参数数量或参数类型(包括不同类型的参数或参数数量的不同)。
构造器的其他特性
- 没有返回类型:构造器没有返回类型,甚至没有void。
- 初始化对象:构造器的主要目的是初始化新对象的状态。
- 自动调用:当通过
new
关键字创建类的新实例时,构造器会自动被调用。 - 父类构造器:子类的构造器默认会调用父类的构造器(通常是无参构造器),这是通过在子类构造器的第一行隐式或显式使用
super()
或this()
实现的。
示例
class Parent {
Parent() {
System.out.println("Parent's no-arg constructor");
}
Parent(String msg) {
System.out.println("Parent's constructor with message: " + msg);
}
}
class Child extends Parent {
Child() {
super(); // 显式调用父类的无参构造器
System.out.println("Child's no-arg constructor");
}
Child(int num) {
super("With number: " + num); // 显式调用父类带参数的构造器
System.out.println("Child's constructor with number: " + num);
}
}
在这个示例中,Parent
类有两个构造器:一个无参构造器和一个带字符串参数的构造器。Child
类继承自Parent
,并定义了自己的两个构造器,它们都通过super()
显式调用了父类相应的构造器。这展示了构造器的重载,但不是重写。
总结
构造器不能被重写,因为它们不遵循方法签名匹配的规则,且子类构造器不是父类构造器的重载版本。然而,构造器可以被重载,即一个类可以定义多个具有不同参数列表的构造器。构造器的主要作用是初始化对象,且在对象创建时自动调用。
二十八、main 方法可以被重写和重载吗?
在Java中,是可以重载main方法的,只要每个重载版本的参数列表(方法签名)不相同。main方法是Java程序的入口点,它必须是一个静态方法,并且返回类型为void。
main方法的重载
-
参数列表不同: 要重载main方法,你需要定义几个具有不同参数列表的版本。参数列表的不同可以体现在参数的数量、类型或者参数的修饰符上。
-
返回类型和修饰符: Java虚拟机(JVM)在启动时只会调用一个main方法,因此所有重载的main方法都必须有相同的返回类型(void)和相同的修饰符(static)。
-
JVM的选择: JVM在启动时会寻找一个特定签名的main方法。如果你重载了main方法,JVM会根据传入的参数类型来选择调用哪个版本的main方法。
示例
public class Application {
// 第一个版本的main方法,不带参数
public static void main() {
System.out.println("Main method called without arguments.");
}
// 第二个版本的main方法,带一个String数组参数
public static void main(String[] args) {
System.out.println("Main method called with String array argument.");
}
// 第三个版本的main方法,带两个String数组参数
public static void main(String[] args1, String[] args2) {
System.out.println("Main method called with two String array arguments.");
}
}
在这个示例中,Application
类有三个重载的main方法。JVM在启动时会根据传递给程序的参数类型来决定调用哪个main方法。如果没有参数传递给程序,JVM将调用不带参数的第一个版本;如果传递了一个String数组(这是Java命令行参数的标准形式),JVM将调用第二个版本;以此类推。
注意事项
- 尽管技术上可以重载main方法,但这种做法通常不推荐,因为它可能会导致程序启动时的混淆。
- 在实际应用中,通常一个类中只有一个main方法,即使重载了main方法,JVM也只会调用匹配启动参数的那个方法。
总结
Java允许重载main方法,只要每个重载版本都有不同的参数列表。JVM在程序启动时会根据传递给程序的参数来选择调用相应的main方法版本。然而,为了避免混淆,通常一个类中只定义一个main方法。