Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中调用内部类的冲突_Java_Arraylist_Inner Classes - Fatal编程技术网

Java中调用内部类的冲突

Java中调用内部类的冲突,java,arraylist,inner-classes,Java,Arraylist,Inner Classes,我正在准备面试,遇到了以下问题: 您有两个类,即Main.java和Gearbox.java档位是一个内部类,如代码所示,它位于齿轮箱中。以下哪个选项将成功执行程序?选项在Main类中给出 简单地说一下:它是在纸上写的,所以我不能在计算机上执行。我已经运行了程序,发现第一个选项将成功运行,但我的问题是,为什么其他选项会抛出错误 Main.java public class Main { public static void main(String[] args) { G

我正在准备面试,遇到了以下问题:

您有两个类,即
Main.java
Gearbox.java
<代码>档位是一个内部类,如代码所示,它位于
齿轮箱
中。以下哪个选项将成功执行程序?选项在
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);
        }
    }
}
公共级变速箱{
私人ArrayList gears;
私人int maxGears;
公共齿轮箱(int maxGears){
这是maxGears=maxGears;
this.gears=新的ArrayList();
}
公共级装备{
私有整数;
私人双重比率;
公共档位(int档位编号,双传动比){
此参数。齿轮编号=齿轮编号;
这个比率=比率;
}
公共双驱动器速度(整数转){
返回转数*(该比率);
}
}
}

使用您当前的定义:

  • 选项:1成功运行,因为您创建了齿轮箱和齿轮箱的实例来初始化齿轮箱。齿轮对象:

    Gearbox.Gear first = mcLaren.new Gear(1, 12);
    System.out.println(first.driveSpeed(1000));
    
  • 选项:2访问实例的方法期望
    Gear
    齿轮箱中的静态类

    Gearbox.Gear second = new Gearbox.Gear(2, 15); 
    System.out.println(second.driveSpeed(1000));
    
  • 选项:3在创建迈凯轮的实例方面似乎是不正确的,相反,如果您像选项1那样创建Gear的实例,它将起作用

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

  • 编辑:由@Grisha在其答案中提供的链接将有助于学习。

    您可能应该阅读。 有关部分是:

    InnerClass的实例只能存在于的实例中 OuterClass并可以直接访问its的方法和字段 封闭实例

    要实例化内部类,必须首先实例化外部类 班级。然后,使用以下命令在外部对象中创建内部对象 语法:

    OuterClass.InnerClass innerObject=outerObject.new InnerClass()


    选项2:

    发生错误的原因是您试图使用内部类
    Gear
    <代码>齿轮
    如果没有变速箱的实例,它就不可能存在。如果将
    public class Gear
    更改为
    public static class Gear
    ,此错误将消失

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

    选项3


    每次使用关键字
    new
    Java都会创建一个新对象。从类创建对象。所以
    new
    后面应该跟一个类构造函数。在本例中,Java正在包
    mcLaren
    中寻找类构造函数,但它当然不存在。

    option2
    Gear不是静态的,因此它需要外部类的实例。
    编译器错误被打印出来。抛出异常。