如何访问受保护的内部类外包?

Poo*_*jan 1 java oop inheritance class inner-classes

package p1;

public class demo1{

     public static void main(String []args){

     }
     protected class demo12{

         protected  int fun2(int a,int b){

             return a*b;
     }

}

package p2;
import p1.demo1;
public class demo2{

     public static void main(String []args){
         //access fun2 method here.
     }    

}
Run Code Online (Sandbox Code Playgroud)

我创建一个包p1并创建一个内部类名demo12.我想要访问demo12 fun2包中的方法p2.怎么做?

在课堂上做任何改变demo2.直接或间接我想从类中访问该方法demo2而不需要更改代码demo1.

Mac*_*ach 5

为了demo12demo2类访问您的内部类,demo2类必须扩展demo1.此外,内部类与类的实例相关联,因此您无法直接从静态方法调用它.

检查内部类和嵌套类之间的区别.

静态嵌套类

与类方法和变量一样,静态嵌套类与其外部类相关联.和静态类方法一样,静态嵌套类不能直接引用其封闭类中定义的实例变量或方法:它只能通过对象引用来使用它们.

内在的类

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

编辑:

我建议检查你的设计是否不能简化类层次结构.特别关注内部和静态嵌套类之间的差异.

你的内部类demo12也被标记为受保护,你也可以扩展它.检查这个hack:

package p2;

import p1.demo1;

public class demo2 extends demo1 {

    protected int foo( int a, int b ) {
        return (new demo22()).fun2(a, b);
    }

    protected class demo22 extends demo12 {
        protected int fun2( int a, int b ) {
            return super.fun2(a, b);
        }
    }

    public static void main( String[] args ) {
        (new demo2()).foo(2, 3);
    }
}
Run Code Online (Sandbox Code Playgroud)