【问题标题】:How does extending outer class works in java扩展外部类如何在java中工作
【发布时间】:2013-04-15 06:04:18
【问题描述】:

参考Question 中的代码,我想知道外部类的扩展是如何工作的。我的意思是一个类(内部类)如何在两个地方有它的定义(由于是内部类而在外部类中,由于扩展了外部类而在其本身中)。完成后里面有什么。

谢谢

代码

public class Something {
    private int y;

        class IsSomething extends Something {

            public void print() {
                System.out.println("123");
            }

        }
}

【问题讨论】:

  • 你的问题没有意义。内部类在一个地方定义:在内部类中。
  • @EJP:但是如果内部类扩展了外部类,那么外部类(包括内部类本身)的所有成员(私有除外)都可以被扩展类使用。所以看起来内部类可以通过外部类访问自己。
  • 还是不清楚。向我们展示一个代码示例。
  • @TheBlastOne:我已经在问题中添加了代码。
  • 内部类 declaration 可以被视为static final 字段,因此内部类不能“访问自身”,而不能访问任何其他类。当您创建内部类的实例时,它包含它自己的所有字段和对外部类实例的reference。但是,外部类 instance 不包含对您刚刚创建的内部实例的引用。

标签: java inner-classes extends outer-classes


【解决方案1】:

内部类具有对其外部类实例的引用。这是一个 has-a 关系。

如果它扩展了它的外部类,它和它的外部类也有一个 is-a 关系。

所以它相当于下面两个顶级类:

public class Foo {
    ...
}

public class Bar extends Foo {
    private Foo outerFoo;
    ...
}

【讨论】:

  • 那么outerFoo实例不会对Bar类的对象有任何引用?
  • 否,除非它显式调用其构造函数并将创建的 Bar 对象分配给一个字段。
  • 如果理解这一点,就虚拟机而言,所有类都是顶级类,嵌套类不需要特殊支持。嵌套都是由编译器转换来处理的。 理解nested & inner 类之后事情就很清楚了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
  • 2020-01-15
相关资源
最近更新 更多