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

静态抽象内部类访问外部类私有字段时的编译器错误

慕朝明
2023-03-14

我有一个带有私有域的类,还有一个带有扩展外部类类型的泛型类型的静态抽象内部类,它试图访问外部类的私有字段,但出现以下错误:-错误:a在外部具有私有访问权限-错误:doSomething在外部具有私有访问权限

见下面的代码:

public abstract class Outer extends SomeOuter
{
    private Object a;
    private void doSomething(){}

    public static absract class Inner<T extends Outer> extends SomeOuter.SomeInner<T> {     
        public InnerMethod(T p) {
            p.a; //error: a has private access in Outer
            p.doSomething() //error: doSomething has private  access in Outer
        }
    }
} 

我正在用jdk 1.7编译

有人能告诉我为什么我得到这个错误。

共有3个答案

葛胡媚
2023-03-14

静态嵌入类实际上是外部类。它无法访问另一个类的私有成员。请参阅以下问题的公认答案:

Java中的静态嵌套类,为什么?

汪兴为
2023-03-14

这就是私有修饰符的工作原理,如果您将任何方法或变量声明为私有的,则不能在类之外访问

梁丘缪文
2023-03-14

内部类可以访问封闭类的私有字段,静态内部类也可以访问封闭类的任何私有成员。

类本身并不是真正的“静态的””;没有静态类这样的东西。本例中的static修饰符表示嵌套类是外部类的静态成员。这意味着可以像访问其他静态成员一样访问它,而不需要外部类的实例

因为它是一个静态成员,所以它能够访问外部类的私有成员,因为类内的私有成员是可访问的。

eg.

class One
{
    private int i=0;
     class Two
    {
         void go()
            {
                System.out.println(new One().i);  //accessible
            }
    }
}
class two 
{
    private  int i=3;
    static class one
    {
        void go()
        {
            System.out.println(new two().i);    //accessible in static class
        }
    }
}

但是在这里,

Inner<T extends Outer> extends SomeOuter.SomeInner<T>

T是一个扩展到外部的类,并不意味着它是内部的。这就是为什么它会出错。

 类似资料:
  • 问题内容: 我有一堂课,还有另一个内部课: 问题答案: 从其他答案中可以看出,您将需要一个非静态内部类来执行此操作。 如果您确实不能使内部类成为非静态类,则可以在外部类中添加所需的getter和setter方法,并通过在内部静态类内部创建外部类的实例来访问它们:

  • 我正在装一个应用程序,它工作得很好。但当我使用 在OuterClass中,并通过

  • 我试图从中的访问,将其放入查询中。我到处都在搜索如何访问它,但到目前为止我什么也没找到。我将非常感谢您的帮助:) 这里有一段代码:

  • 问题内容: 在ES6中,给出以下示例: 如何访问Color.mainDark(静态字段)? 问题答案: 您可以按期望的方式访问它,但是,如果我记得使用Babel并立即导出类时存在一些问题,因此 如果 遇到问题,请在定义类后导出: 您可以在玛丽安(Marian)对类似问题的回答中了解有关巴别塔(Babel)问题的更多信息,该问题据说已在巴别塔(Babel)6.2.1中修复。

  • 我想使用Powermock(基于EasyMock)模拟私有静态内部类。这不是来自生产代码,这只是一个是否可能的问题。我很确定这是一个糟糕的设计,但这是我为科学而努力的东西。 假设我们有一个具有静态私有内部类的类: IExpectationSetters中的andReturn(capture)不能应用于(java.lang.Object)  私人静态内部阶级的嘲笑甚至可能吗?我还没有在SO上找到一个

  • 这是我正在研究的一个更大问题的一个简短的子问题。 为什么我不能通过第8行outer class中的inner class的实例访问outer类字段? 字段在内部类中可见。 外部类中的非静态方法仍然存在此问题。 字段的可见性并不重要。无论从哪种方式,它都可以从内部类中看到。 可以通过内部类中的(私有)getter访问该字段,但我出现问题的原因之一是,我希望避免这些。 它应该成为不可变的构建器模式的一