【问题标题】:Why can't we access private methods of inner class from the enclosing class? [closed]为什么我们不能从封闭类访问内部类的私有方法? [关闭]
【发布时间】:2014-05-27 00:31:24
【问题描述】:
public class EnclosingClass{


    public void enclosingClassMethod(){
          InnerClass iC = new InnerClass();
          ic.innerClassPrivateMethod();   // this one works but why the following line doesn't       //work

          InnerClass.innerClassPrivateMethod();  // Why I can't call the method like this?


    }



    public class InnerClass{
         private void innerClassPrivateMethod(){

         }

    }

}

为什么我们不能像InnerClass.innerClassPrivateMethod() 一样调用innerClassPrivateMethod()?我看到“无法从 EnclosureClass 类型对非静态方法 innerClassPrivateMethod() 进行静态引用”

如果我将innerClassPrivateMethodenclosingClassMethod 都更改为私有,我会收到错误

 InnerClass iC = new InnerClass();

as “没有 Basics6 类型的封闭实例可访问。必须使用 enclosureClass 类型的封闭实例来限定分配。”

【问题讨论】:

  • 回答标题问题:你绝对可以。你的代码会抛出什么错误?你查过吗?
  • 因为它不是静态的。你需要一个对象来访问它。
  • I am not getting any error. 那么显然没有问题...请明确您的要求。
  • 抱歉,我收到无法对非静态方法 innerClassPrivateMethod() 进行静态引用的错误。但是这里的一切都是非静态的,对吧?我没有使用静态关键字
  • 好的,现在把那个错误信息放到 SO 的搜索工具中。

标签: java oop private


【解决方案1】:

如果您想使用类名调用内部类的方法,或者我们可以静态地说,那么您需要进行以下更改。

  1. 将内部类方法声明为静态。
  2. 非静态内部类永远不可能有静态方法所以你需要将内部类更改为静态。

    公共类 EnclosureClass{

    public void enclosingClassMethod(){
          InnerClass iC = new InnerClass();
          iC.innerClassPrivateMethod();   // this one works but why the following line doesn't       //work
    
          InnerClass.innerClassPrivateMethod();  // This also works...
    
    
    }
    
    
    
    public static class InnerClass{     //  Class converted to static 
         private static void innerClassPrivateMethod(){   // Method converted to static
    
         }
    
    }
    

    }

【讨论】:

  • 很好解释。谢谢。
【解决方案2】:

如果方法没有表示static,它是一个实例方法。在这种情况下,实例必须是内部类。由于在第二次调用中没有通过实例访问方法,所以没有this引用等。

在内部类中定义static 方法是毫无用处的。首先是任意一个静态方法的“支持类”。我可以将public static void sort (int[] data); 以及Utils 类添加到ThisIsAUselessClass。它之所以重要的唯一原因是因为您有时想要创建这样的方法private。现在,由于一个类可以看到其内部类的所有(包括private)成员,并且内部类可以访问其“外部类”的所有私有方法,因此没有理由在内部类中定义静态方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 2013-11-13
    • 1970-01-01
    • 2018-11-23
    • 2014-09-20
    • 2016-07-04
    • 2020-08-02
    相关资源
    最近更新 更多