你能告诉我这个程序是如何工作的吗?

时间:2015-10-28 15:07:49

标签: java object instance inner-classes

如果s1指的是由f1.switch()创建的新对象,那么 (1)变量runningStatus如何传递给为内部类创建的新对象? (2)变量runningStatus的变化如何在内部类的对象(由s1引用)中完成,反映在由f1引用的Fan的对象中?

interface Switch
{
    void on();
    void off();
}

class Fan
{
    private boolean runningStatus;
    public Switch getSwitch()
    {
        return new Switch()
        {
            public void on()
            {
                runningStatus = true;
            }
            public void off()
            {
                runningStatus = false;
            }
        };
    }
    public boolean getRunningStatus()
    {
        return runningStatus;
    }
}

class FanStatus
{
    public static void main(String[] args)
    {
        Fan f1 = new Fan();
        Switch s1 = f1.getSwitch();
        s1.on();
        System.out.println(f1.getRunningStatus());
        s1.off();
        System.out.println(f1.getRunningStatus());
    }
}

3 个答案:

答案 0 :(得分:4)

(1) How is variable runningStatus passed to the new object created for the inner class?

Switch的实例正在访问Fan的runningStatus,它不会像参数一样被传递。

(2) How is change in variable runningStatus done in object of inner class (referred by s1), reflecting in the object of Fan referred by f1?

当Switch实例从Fan的实例中更改变量时,它实际上是同一个变量。它没有通过价值"传递,或者#34;通过引用"传递,更像是:

f1.getSwitch().on() 

~ is equivalent to ~

f1.switch.runningStatus = true

答案 1 :(得分:0)

  1. 内部类与变量runningStatus共享相同的范围,因此它对内部类是可见的。将内部类视为Fan对象中的另一个变量。

  2. 方法getSwitch()返回调用方法时实例化的Switch对象的引用。因此对s1进行任何更改意味着您实际上正在更改Switch实例中Fan对象的属性,在本例中为f1,这有效地改变了属性f1

答案 2 :(得分:0)

(1)内部类可以访问所有变量实际上在教程中被称为匿名类

Java Tutorial

(2)如(1)中所述,本地类或匿名类的属性访问外部类的所有变量

Great Inner Outer classes explanation