但由于所有的内部类都实现了接口InMethod。

  <<interface>> InMethod.java

public interface InMethod {
    void public_method();
}

  所以还是可以通过接口的引用访问到private内部类的public方法。自然default、protected和public的都可以访问这个public方法。

// create a private inner object by 'out's method',
// but use Interface reference to handle it
InMethod privateIn=out.getPrivateIn();
privateIn.public_method();

  3、不同包其他类的访问

  在另一个包中建立一个类DifferPackage.java。

  DifferPackage.java

package com.zj.other;
 
import com.zj.main.InMethod;
import com.zj.main.Out;
 
public class DifferPackage {
    public static void main(String[] args){
       //create an outer object
       Out out=new Out();
     
       //create a public inner object by 'new'
       Out.PublicIn publicIn=out.new PublicIn();
       publicIn.public_arg=0;
       publicIn.public_method();
     
       // create a public inner object by 'out's method'
       Out.PublicIn publicIn2 = out.getPublicIn();
       publicIn2.public_arg=0;
       publicIn2.public_method();
     
       //use Interface reference
       InMethod method;
       method=out.getPrivateIn();
       method.public_method();
       method=out.getDefaultIn();
       method.public_method();
       method=out.getProtectedIn();
       method.public_method();
       method=out.getPublicIn();
       method.public_method();
    }
}

  通过new方式和getInnerInstance()方法只能访问public内部类的public成员和public方法;如果使用接口的引用,则可以访问所有4个内部类的public方法。