4

考虑以下代码段。

package breakoop;

public class BreakOOP {

    public static class A{
        private int a;
    }

    public static class B extends A{
        public int f(){
            return super.a;
        }
    }

    public static void main(String[] args) {
        B b = new B();
        System.out.println(b.f());
    }
}

A该示例仅在并且B被封装在BreakOOP类中时才编译。

这似乎违背了 OOP 的一些基本概念。有人可以解释为什么会编译吗?其背后的原因是什么?

4

2 回答 2

3

检查这个:https ://docs.oracle.com/javase/tutorial/java/javaOO/nested.html 。它说它通过允许static类访问顶级类的私有成员来增加封装(有时您可能需要这样做)。并且a是类的私有成员A,它在的范围内BreakOOP,这反过来又使它可以在类内部访问B

于 2016-09-27T12:02:09.583 回答
1

Java 语言规范指出:

私有类成员或构造函数只能在包含成员或构造函数声明的顶级类(第 7.6 节)的主体内访问。

由于类AB是在该规则的主体中定义的,BreakOOP因此适用并且B可以看到A.

至于 OOP 概念:因为AB是静态内部类,它们与真正的内部类没有特殊的生命周期关系BreakOOP(即您不需要实例BreakOOP来创建 or 的新实例,AB它们仍然具有一种特殊的关系,因为它们可以访问私有成员。如果它们不应该具有这种关系,那么它们不应该是内部类,而是真正的顶级类。

于 2016-09-27T12:53:03.010 回答