我一直在阅读有关内部课程的一些文档,目前正在阅读我的教科书,在那里我找到了一些关于使用内部类的好知识。对于初学者,我想考虑以下示例,并确保我理解正确的事情。作为参考,我已阅读了以下Inner Classes Documentation并阅读了几个SO问题。希望有人可以指导我完成以下事项。
import java.util.ArrayList;
public class Gearbox {
private ArrayList<Gear> gears;
private int maxGears;
private int currentGear;
public Gearbox(int maxGears)
{
this.maxGears = maxGears;
this.gears = new ArrayList<Gear>();
Gear neutral = new Gear(0,0.0);
this.gears.add(neutral);
}
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 * ratio;
}
}
}
在main.java
public class Main {
public static void main(String [] args)
{
Gearbox ford = new Gearbox(6);
Gearbox.Gear first = ford.new Gear(1,20);
System.out.println(first.driveSpeed(10));
}
}
我有点困惑的是实际使用嵌套类中的一些东西的符号。例如
Gearbox ford = new Gearbox(6);
我们在此处制作属于ford
类的Gearbox
对象,其值为6
至maxGears
。
接下来我们有Gearbox.Gear first = ford.new Gear(1,20);
,这就是我对实际情况感到困惑的地方。 .Gear
让编译器知道Gear
是Gearbox
中的内部类吗?如果是这样,为什么下一个语句ford.new Gear(1,12.3)
?
Gearbox.Gear first = new ford.Gear(1,12.3);
之类的内容会不会更有意义吗?
答案 0 :(得分:2)
您的内部类不是静态的,这意味着它属于具体实例。
Gearbox.Gear first = new ford.Gear(1,12.3);
表示您为实例ford
创建Gear。
Here你可以阅读更多关于内部类以及静态和非静态内部类的差异。
答案 1 :(得分:2)
接下来我们有
Gearbox.Gear first = ford.new Gear(1,20);
这就是我对实际情况感到困惑的地方。 .Gear是否让编译器知道Gear是Gearbox中的内部类?
是的......有点儿。实际上,它是在说“我在谈论在Gear
中声明的Gearbox
类。它不一定是内部类:它可以是嵌套类。
如果是,为什么下一个语句
ford.new Gear(1,12.3)
?
必须在其封闭外部类的实例的上下文中创建内部类的实例。 ford.new Gear(...)
表示在Gear
引用的Gearbox
实例的上下文中创建新的ford
实例。
(如果仍然没有意义,请重读以上内容,特别注意“实例”一词的用法。类的实例是一个对象.....)
正如@Thilo指出的那样,在这里使Gear
成为内部类(而不是嵌套类)并没有真正实现任何目标。将重新声明Gear
作为
public static class Gear ...
然后您不需要使用new
类的实例限定Gearbox
。