SteDeshain 2021-06-24 21:37 采纳率: 0%
浏览 23

为什么java内部类成功访问到了外部类中的非 final 成员?

package priv.stedeshain.innerclass;

class Obj {
    int i;
    public Obj(int i) {
        this.i = i;
    }
    public String getValue() {
        return Integer.toString(i);
    }
}

interface U {
    void a();
}

class A {
    Obj var;

    public A(Obj a) {
        this.var = a;
    }

    public U getU() {
        return new U() {

            @Override
            public void a() {
                System.out.println("A(" + this + ") var=" + var.getValue() + "(" + var + ") is calling method a()");
                System.out.println();
            }
        };
    }
}

public class Practice23 {
    public static void main(String[] args) {
        A a = new A(new Obj(1));

        U u = a.getU();
        u.a();

        a.var = new Obj(199999);
        System.out.println("a.var = new Obj(199999)");

        U u2 = a.getU();
        u2.a();
        u.a();
    }
}

代码里,内部类成功访问到了外部类的非 final 成员(是实质上的非 final 成员,在后面的代码里甚至还修改了该成员指向的对象)

但是这种行为不是不被允许的吗?

这是执行结果:

 望有人为我解惑

  • 写回答

4条回答 默认 最新

  • CSDN专家-Time 2021-06-24 21:44
    关注

    没有访问到外部啊。

    这分明是你用构造函数 构造进来的对象。

    外部指的是没有联系的外部。

    A类里有B对象,然后你把B对象,初始化了,用A类中的B对象 调用了A类成员对象的方法。

    就说,B类调用了外部类的方法?。

    A类呢?A类变成蝴蝶飞走了?

    评论

报告相同问题?

悬赏问题

  • ¥15 为啥画版图在Run DRC会出现Connect Error?可我Calibre的hostname和计算机的hostname已经设置成一样的了。
  • ¥20 网站后台使用极速模式非常的卡
  • ¥20 Keil uVision5创建project没反应
  • ¥15 mmseqs内存报错
  • ¥15 vika文档如何与obsidian同步
  • ¥15 华为手机相册里面的照片能够替换成自己想要的照片吗?
  • ¥15 陆空双模式无人机飞控设置
  • ¥15 sentaurus lithography
  • ¥100 求抖音ck号 或者提ck教程
  • ¥15 关于#linux#的问题:子进程1等待子进程A、B退出后退出(语言-c语言)