Вы можете мне сказать, как работает эта программа?
Если s1 относится к новому объекту, созданному f1.switch(), то
(1) Как переменная runningStatus передается новому объекту, созданному для внутреннего класса?
(2) Как происходит изменение переменной runningStatus в объекте внутреннего класса (обозначаемом s1), отражаясь в объекте вентилятора, обозначаемом f1?
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 ответов:
(1) How is variable runningStatus passed to the new object created for the inner class?Fan's runningStatus доступен экземпляру Switch, он не передается как параметр.
(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, это фактически та же переменная. Это не "передается по значению" или "передается по ссылке", это больше похоже на:
f1.getSwitch().on() ~ is equivalent to ~ f1.switch.runningStatus = true
Внутренний класс имеет ту же область видимости, что и переменная
runningStatus, поэтому он виден внутреннему классу. Думайте о внутреннем классе как о другой переменной внутри объектаFan.Метод
getSwitch()возвращает ссылку на объектSwitch, созданный при вызове метода. следовательно, внесение каких-либо изменений вs1означает, что вы фактически изменяете свойства объектаSwitchвнутри экземпляраFan, в данном случаеf1, что эффективно изменяет свойстваf1.
(1) все переменные могут быть доступны внутренним классом фактически в учебнике известен как анонимный класс
(2) как указано в (1) является свойством локального класса или анонимного класса доступа ко всем переменным внешнего класса
Comments