【问题标题】:Why is calling a method (non-static) of the outer class with an object of an inner class not allowed outside the definition of the outer class? [duplicate]为什么在外部类的定义之外不允许使用内部类的对象调用外部类的方法(非静态)? [复制]
【发布时间】:2016-05-21 15:09:19
【问题描述】:

我们知道内部类的对象只能从封闭类的对象中产生。那么为什么内部类的对象不能在封闭类定义之外调用封闭类的非静态方法呢?

public class OuterClass
{       
public class InnerClass
    {
        public void innerMethodA()
        {
            outerMethodA(); // This is OK.
            new InnerClass().outerMethodA(); // This is not OK.
        }
    }

    public void outerMethodA()
    {
        System.out.println("This is OuterMethodA");
    }
}

public class ExtraClass 
{
    public void testMethod()
    {
        OuterClass outerObj = new OuterClass();

        OuterClass.InnerClass innerObj = outerObj.new InnerClass();

        outerObj.outerMethodA();  // This is OK.
        innerObj.outerMethodA();  // This is not. Why is that?
    }
}

请原谅任何格式错误或我提出问题的方式。经过一些反对票后,我对其进行了编辑。我已经尽力了。谢谢。

【问题讨论】:

  • 我认为这需要代码。我不太确定你的意思。
  • 您需要任何类的实例来调用它的非静态方法。内部类不会因为被封闭而神奇地拥有该实例
  • 你为什么要做这样的事情?这个问题背后的驱动力是什么?这在什么情况下有意义?
  • 我还没有对此进行测试,但我认为在这两种情况下,outerMethod 不是InnerClass 的成员。
  • @Tom:这不是重复的。该问题仅涉及从内部类定义中调用外部类方法。

标签: java inner-classes non-static


【解决方案1】:

根据这个堆栈溢出问题,(实际上)不可能从内部类中获取封闭类。

get the enclosing class object from anonymous inner class as function parameter

我看到的唯一解决方案是在 InnerClass 上提供一个方法来为您调用。

class OuterClass
{

   public class InnerClass
   {
      public void innerMethodA()
      {
         outerMethodA(); // This is OK.
         enclosingInstanceMethodA(); // This is OK now.
      }

      public void enclosingInstanceMethodA()
      {
         OuterClass.this.outerMethodA();
      }
   }

   public void outerMethodA()
   {
      System.out.println( "This is OuterMethodA" );
   }
}

class ExtraClass
{

   public void testMethod()
   {
      OuterClass outerObj = new OuterClass();
      OuterClass.InnerClass innerObj = outerObj.new InnerClass();
      outerObj.outerMethodA();  // This is OK.
      innerObj.enclosingInstanceMethodA();  // This is OK now.
   }
}

【讨论】:

    猜你喜欢
    • 2018-09-20
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 2022-01-25
    相关资源
    最近更新 更多