在Java中调用内部类的冲突

时间:2017-08-11 03:46:03

标签: java arraylist inner-classes

我正准备接受采访,我遇到了以下问题:

您有两个班级,即Main.javaGearbox.javaGear是一个内部类,位于Gearbox中,如代码所示。哪个选项会成功执行程序?选项在Main类中给出。

只是为了快速记录:它是在纸上给出的,所以我无法在计算机上执行。我运行程序,发现第一个选项将成功运行,但我的问题是为什么其他选项会抛出错误?

Main.java

public class Main {

    public static void main(String[] args) {
        Gearbox mcLaren = new Gearbox(6);

        //Option:1
        Gearbox.Gear first = mcLaren.new Gear(1, 12);
        System.out.println(first.driveSpeed(1000));

        //Option: 2
        Gearbox.Gear second = new Gearbox.Gear(2, 15);
        System.out.println(second.driveSpeed(1000));

        //Option: 3
        Gearbox.Gear third = new mcLaren.Gear(3, 17);
        System.out.println(third.driveSpeed(1000));

    }
}

Gearbox.java

public class Gearbox {
    private ArrayList<Gear> gears;
    private int maxGears;

    public Gearbox(int maxGears) {
        this.maxGears = maxGears;
        this.gears = new ArrayList<>();
    }

    public class Gear{
        private int gearNumber;
        private double ratio;

        public Gear(int gearNumber, double ratio) {
            this.gearNumber = gearNumber;
            this.ratio = ratio;
        }

        public double driveSpeed(int revs){
            return revs * (this.ratio);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

选项2:

发生错误是因为您尝试使用内部类Gear。如果Gear没有GearBox的实例,则public class Gear不能存在。如果您将public static class Gear更改为Gear,则此错误会消失。

编辑:有趣的是,当您将内部类static更改为new时,选项1现在会抛出错误,因为您尝试从静态类创建实例。

选项3

每次使用关键字new时,Java都会创建一个新对象。您可以从类创建对象。所以mcLaren后面应该跟一个类构造函数。在这种情况下,Java正在查找包{{1}}中的类构造函数,但当然它并不存在。