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

时间:2015-08-12 11:59:01

标签: java class oop inheritance 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.
     }    

}

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

在课程demo2中做任何更改。直接或间接地我想从类demo2访问该方法,而不需要更改代码demo1

2 个答案:

答案 0 :(得分:5)

要从demo12班级访问您的demo2内部班级,demo2班级必须延长demo1。此外,内部类与类的实例相关联,因此您无法直接从静态方法调用它。

检查inner and nested classes之间的差异。

  

静态嵌套类

     

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

     

内部课程

     

与实例方法和变量一样,内部类是关联的   使用其封闭类的实例并可直接访问它   对象的方法和字段。另外,因为内部阶级是   与实例相关联,它无法定义任何静态成员   本身。

编辑:

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

你的内部班级demo12也被标记为受保护,你也可以扩展它。检查这个黑客:

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);
    }
}

答案 1 :(得分:0)

您的班级demo2应该继承demo1

class demo2 extends demo1 {...}