整理好了!2024年最常见 100 道 Java基础面试题(十四)

上一篇地址:整理好了!2024年最常见 100 道 Java基础面试题(十三)-CSDN博客

二十七、构造器可以被重写和重载吗?

在Java中,构造器是用于创建类实例时初始化对象的特殊方法,它们有一些独特的特性。

构造器是否可以被重写(Override)

  • 答案:不可以。
  • 原因:重写是针对具有相同方法签名的方法来说的,而构造器的名称必须与类名完全相同,且没有返回类型(连void也不行)。由于子类和父类的构造器名称不相同(它们与各自的类名相同),它们无法匹配父类的构造器名称,因此无法被重写。

构造器是否可以被重载(Overload)

  • 答案:可以。
  • 原因:构造器可以被重载,这意味着一个类可以有多个具有不同参数列表的构造器。重载基于不同的参数数量或参数类型(包括不同类型的参数或参数数量的不同)。

构造器的其他特性

  1. 没有返回类型:构造器没有返回类型,甚至没有void。
  2. 初始化对象:构造器的主要目的是初始化新对象的状态。
  3. 自动调用:当通过new关键字创建类的新实例时,构造器会自动被调用。
  4. 父类构造器:子类的构造器默认会调用父类的构造器(通常是无参构造器),这是通过在子类构造器的第一行隐式或显式使用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方法的重载

  1. 参数列表不同: 要重载main方法,你需要定义几个具有不同参数列表的版本。参数列表的不同可以体现在参数的数量、类型或者参数的修饰符上。

  2. 返回类型和修饰符: Java虚拟机(JVM)在启动时只会调用一个main方法,因此所有重载的main方法都必须有相同的返回类型(void)和相同的修饰符(static)。

  3. 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方法。

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值