Вы можете мне сказать, как работает эта программа?



Если 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());
}
}
602   3  

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
  1. Внутренний класс имеет ту же область видимости, что и переменная runningStatus, поэтому он виден внутреннему классу. Думайте о внутреннем классе как о другой переменной внутри объекта Fan.

  2. Метод getSwitch() возвращает ссылку на объект Switch, созданный при вызове метода. следовательно, внесение каких-либо изменений в s1 означает, что вы фактически изменяете свойства объекта Switch внутри экземпляра Fan, в данном случае f1, что эффективно изменяет свойства f1.

(1) все переменные могут быть доступны внутренним классом фактически в учебнике известен как анонимный класс

Учебник По Java

(2) как указано в (1) является свойством локального класса или анонимного класса доступа ко всем переменным внешнего класса

Великие внутренние внешние классы объяснение

Comments

    Ничего не найдено.