Java 你能告诉我这个计划是如何运作的吗?

Java 你能告诉我这个计划是如何运作的吗?,java,object,instance,inner-classes,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 getSwitc

如果
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());
    }
}
交换机实例正在访问风扇的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实例中的变量时,它实际上是同一个变量。它不是“按值传递”或“按引用传递”,更像是:

f1.getSwitch().on() 

~ is equivalent to ~

f1.switch.runningStatus = true
  • 内部类与变量
    runningStatus
    共享相同的作用域,因此它对内部类可见。将内部类视为
    Fan
    对象中的另一个变量

  • 方法
    getSwitch()
    返回调用该方法时实例化的
    Switch
    对象的引用。因此,对
    s1
    进行任何更改都意味着您实际上在
    Fan
    实例内更改
    开关
    对象的属性,在本例中为
    f1
    ,这将有效地更改
    f1
    的属性

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

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


    内部类可以访问其封闭的外部类实例变量。他们可以修改它们。您会注意到,您不能这样做,因为
    开关
    不是
    静态类
    。由于它不是静态的,类
    开关
    基本上是
    风扇内部的“助手”或“容器”,用于组织代码。这就是ergonaut用
    f1.switch.runningStatus=true表达的内容。
    
    f1.getSwitch().on() 
    
    ~ is equivalent to ~
    
    f1.switch.runningStatus = true