【问题标题】:How to access protected inner class outside package?如何访问包外受保护的内部类?
【发布时间】:2015-11-05 00:37:07
【问题描述】:
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。我想访问包p2中的demo12fun2方法。怎么做?

demo2 进行任何更改。我想直接或间接地从demo2 类访问该方法而不更改demo1 的代码。

【问题讨论】:

    标签: java class oop inheritance inner-classes


    【解决方案1】:

    为了从 demo2 类访问您的 demo12 内部类,demo2 类必须扩展 demo1。此外,内部类与类的实例相连,因此不能直接从静态方法中调用。

    检查inner and nested classes之间的区别。

    静态嵌套类

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

    内部类

    与实例方法和变量一样,内部类是关联的 具有其封闭类的实例并可以直接访问该类 对象的方法和字段。另外,因为内部类是 与实例关联,它不能定义任何静态成员 自己。

    已编辑:

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

    你的内部类demo12 也被标记为protected,你也可以扩展它。检查这个黑客:

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

    【讨论】:

    • 如何间接实现?你能告诉我吗 ?我试过了,但我只能访问受保护的类而不是方法。
    • 我已经扩展了答案。
    • 您只需在 demo22 中创建相同的方法。我理解你的黑客。但是是否有其他方法可以访问 fun2 而无需在 demo22 类中创建相同的方法?谢谢你……@Maciej Lach
    • demo22.fun2() 应该从demo12 通过super 调用方法。
    【解决方案2】:

    你的类demo2应该继承demo1

    class demo2 extends demo1 {...}
    

    【讨论】:

    • 用类 demo2 做任何事情,但告诉我如何访问 fun2?
    • 见@Maciej Lach 回答
    猜你喜欢
    • 1970-01-01
    • 2018-05-22
    • 2013-12-22
    • 2020-11-02
    • 2013-07-10
    • 2013-04-08
    • 1970-01-01
    • 2011-03-19
    • 2011-05-24
    相关资源
    最近更新 更多