创建内部类并使用它们(理解一些代码)

时间:2016-08-27 03:40:24

标签: java

我一直在阅读有关内部课程的一些文档,目前正在阅读我的教科书,在那里我找到了一些关于使用内部类的好知识。对于初学者,我想考虑以下示例,并确保我理解正确的事情。作为参考,我已阅读了以下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对象,其值为6maxGears

接下来我们有Gearbox.Gear first = ford.new Gear(1,20);,这就是我对实际情况感到困惑的地方。 .Gear让编译器知道GearGearbox中的内部类吗?如果是这样,为什么下一个语句ford.new Gear(1,12.3)

Gearbox.Gear first = new ford.Gear(1,12.3);之类的内容会不会更有意义吗?

2 个答案:

答案 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