Java—试图理解重载方法是如何工作的

Java—试图理解重载方法是如何工作的,java,overloading,Java,Overloading,我刚开始学习Java,我有一个关于方法重载的问题 我想知道是否可以在所讨论的重载方法的另一个变体的范围内调用重载方法的变体 我的主要问题是: 这样做可能会产生什么问题 例如: public class RoomClass { int roomNo = 1; String roomType = "Lecture Hall"; String roomArea = "First Floor"; boolean ACMachine = true; protec

我刚开始学习Java,我有一个关于方法重载的问题

我想知道是否可以在所讨论的重载方法的另一个变体的范围内调用重载方法的变体

我的主要问题是: 这样做可能会产生什么问题

例如:

public class RoomClass {

    int roomNo = 1;
    String roomType = "Lecture Hall";
    String roomArea = "First Floor";
    boolean ACMachine = true;

    protected void setData(int roomNo, String roomType, String roomArea, boolean ACMachine) {

        setData(roomNo);
        setData(roomType, roomArea);
        setData(ACMachine);
    }

    protected void setData(int roomNo) {
        this.roomNo = roomNo;
    }

    protected void setData(String roomType, String roomArea) {

        this.roomType = roomType;
        this.roomArea = roomArea;
    }

    protected void setData(boolean ACMachine) {

        this.ACMachine = ACMachine;
    }
}
public void foo(int a, int b) {
    // do something with a and b
}

public void foo(int a) {
    // supply default value of 0 for b
    foo(a, 0);
}
上面的代码是关于一个练习的。我无法在网上或书中找到我问题的答案。
我试图做的是避免重复代码,所以我想为什么不调用其他方法,因为它们正是我所需要的?。因此,我只是将所有其他方法聚合到第一个方法中。

这样做没有问题,因为它在编程上是正确的。重载方法可以从另一个重载方法调用。

根本没有问题。Java虚拟机可以通过参数数量和数据类型分别识别重载方法。在你的例子中,我看不出有任何问题。

这不仅是安全的,而且是非常常见的事情。Java没有默认参数值,因此您经常会看到参数较少的重载调用参数较多的重载并提供默认值。例如:

public class RoomClass {

    int roomNo = 1;
    String roomType = "Lecture Hall";
    String roomArea = "First Floor";
    boolean ACMachine = true;

    protected void setData(int roomNo, String roomType, String roomArea, boolean ACMachine) {

        setData(roomNo);
        setData(roomType, roomArea);
        setData(ACMachine);
    }

    protected void setData(int roomNo) {
        this.roomNo = roomNo;
    }

    protected void setData(String roomType, String roomArea) {

        this.roomType = roomType;
        this.roomArea = roomArea;
    }

    protected void setData(boolean ACMachine) {

        this.ACMachine = ACMachine;
    }
}
public void foo(int a, int b) {
    // do something with a and b
}

public void foo(int a) {
    // supply default value of 0 for b
    foo(a, 0);
}

可能出现的一个问题是,如果有人扩展您的类并重写fooint,int。这也会影响fooint的行为,这可能是意外的。为了防止这种情况,可以将fooint、int或整个类设置为final。如果允许扩展,则应记录哪些方法调用其他方法。对于不应该记录实现细节的规则来说,这是一个罕见的例外。

为什么不运行程序并找出答案呢?我写的代码是关于java初学者级别的一个练习。我想知道这个例子在大型项目中是否可行,或者是否会产生问题。另外,在发布问题之前,我确实运行了这个程序,它运行得很好。根据我的说法,它不会出现任何问题。。。类比-假设您在办公室中有一个窗口,该窗口采用所有详细信息的形式,首先是功能,然后在其办公室中,它有不同的人,负责不同的职责,其他功能,它将发送数据进行处理,可以是同一指定人员,但有一项特定任务要执行,例如setDataint roomNo,也可以是另一名指定不同任务的人员。。。他们可以随时打电话给对方。。。希望能有帮助。。