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档位编号,双传动比){
此参数。齿轮编号=齿轮编号;
这个比率=比率;
}
公共双驱动器速度(整数转){
返回转数*(该比率);
}
}
}
使用您当前的定义:
Gearbox.Gear first = mcLaren.new Gear(1, 12);
System.out.println(first.driveSpeed(1000));
Gear
是齿轮箱中的静态类
:
Gearbox.Gear second = new Gearbox.Gear(2, 15);
System.out.println(second.driveSpeed(1000));
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
中寻找类构造函数,但它当然不存在。option2Gear不是静态的,因此它需要外部类的实例。
编译器错误被打印出来。抛出异常。