当前位置: 首页 > 知识库问答 >
问题:

内部类继承和对封闭类方法/字段的访问

公孙琛
2023-03-14

下面是我发现的关于内部类的两个语句

JavaDocs:

与实例方法和变量一样,内部类与其封闭类的实例相关联,并可以直接访问该对象的方法和字段。此外,因为内部类与实例相关联,所以它本身不能定义任何静态成员。

在另一个网站上,我发现了这个:

在大多数情况下,嵌套类就是在封闭类的定义中声明的类。它不会从封闭类继承任何东西,嵌套类的实例不能分配给封闭类的变量引用。

粗体标记的线条不矛盾吗?如何才能不继承周围的对象字段和方法,同时又可以访问其字段和方法?

共有2个答案

钱睿范
2023-03-14

请不要将术语嵌套类和内部类视为相反或类似的东西。事实上,嵌套类只是描述在另一个类中声明的所有类:

>

  • 声明为静态的嵌套类称为静态嵌套类
  • 非静态嵌套类称为内部类。有三种类型(有关更多信息,请参阅JLS§8.1.3):

    1. 非静态成员类
    2. 本地班
    3. 匿名类

    您引用的第一段解释了内部类可以访问(read:access,而不是inherit)封闭实例的方法和字段。注意,它是关于一个实例,而不是类。

    第二段试图解释类和其中的嵌套类之间没有关系,除了它们的位置。

  • 穆建华
    2023-03-14

    不,它们并不冲突。请看以下示例:

    public class A {
    
         public void foo() {
             //some code
         }
    
         public class B {
    
             public void bar() {
                  foo();
             }
         }
    }
    

    在本例中,内部类B可以访问A方法(实际上也可以访问其任何字段),但无论如何都不会发生继承。

    例如,对B的以下更改将导致编译错误:

     public class B {
    
         public void bar() {
              super.foo();
         }
     }
    

    因为B不是从A继承的。它可以访问其实例成员,但不能从中扩展(继承)。

     类似资料:
    • 我知道如果我想扩展内部类,我应该这样做: 但是在这种情况下,我不明白该怎么办?如何获取内部对象的封闭实例? 此变体不编译:

    • 我认为内部类的成员,即使被声明为私有的,也可以从它的封闭类中访问。但是我遇到了以下代码结构的编译时错误。我的顶级类实现了Iterable接口。Iterator在内部类中实现。当内部类的一个实例通过iterator()方法获得时,我无法使用该实例访问数据栏。 有什么建议吗?

    • 问题内容: 我正在使用Java 6。 我无法让内部类使用与其包含的类相同的泛型类。目前我有 现在我得到警告 类型参数T隐藏了类型T 如果我从内部类中删除类型参数(即从行中删除),则会在该行上出现编译错误。 我怎样才能使一切正确? 问题答案: 您可以: 从(即,使其成为非泛型的)中移除类型参数-仍然可以访问external 。 将class中的type参数重命名为(say)。 [更新] 下面是四种重

    • 问题内容: 通读“用Java思考”,我陷入了《内部类》一章的ex:6。 练习6:(2)在自己的程序包中使用至少一种方法创建一个接口。在单独的程序包中创建一个类。添加一个实现该接口的受保护的内部类。在第三个包中,从您的类继承,并在方法内部,返回受保护的内部类的对象,并在返回期间向上转换到接口。 这是我的代码: IOne.java 接口 COne.java 具有实现接口的受保护内部类的类 CTwo.j

    • 我尝试了下面的代码,根据它,我理解内部类继承到OuterClass的子类。是正确的吗? 输出除外: 2. 奥特你好。内部的 当这行代码运行时,它应该意味着内部类被继承给了ChildClass 我很困惑,因为我在链接上发现了下面的语句 当外部类由其子类扩展时,成员内部类将不会继承到子类。若要在外部类的子类内使用内部类属性,子类还必须具有内部类,并且该内部类必须扩展外部类的内部类。

    • (我一直在重读那个问题标题,思考它看起来有多荒谬,但我向你保证,这是对问题的最佳描述,我有一个实际的应用程序,其中这是最好的结构。我发誓我没有疯。) 考虑以下内容。每个块都是一个单独的文件: 注意,enclosinstance业务是为了解决涉及中间构造函数调用的问题。请参阅“为什么外部类不能扩展内部类?”。 我希望输出为“2”。但是相反,我在System.out.println(a.this.I)