简体   繁体   中英

Java - Unable to access protected method of superclass extended by nested class

I'm new to java and getting the hang of protected visibility.

I have Class A which has protected method method1 as follows -

public abstract class A { 
    public A(...){}

    protected void method1(){
        // do something
    }

Now I have another Class B which extends a different Class C. Class B has a nested static class, Class D extending Class A

public class B extends C {
    public B(...){
        super(...);
    }

    private static class D extends A {
        D(...){super(...);}
    }

    public void method2() {
        D record = new D();
        record.method1(); // need to access the protected method1 of class A, which is the superclass of nested class D. Getting the error here
    }
}

I get this error - method1 has protected access in Class A Now my question is how can I access method1? I cannot change it to public in class A

You need to create a proxy method in class D as outlined below. Class D can access Class A's protected methods, but an instance of Class D can't call protected methods directly, and must have a proxy method to call the protected method of the super class.

In class D, you need to create a public getter for the method in Class A, so:

public class A {
    protected void protectedMethod() {}
}

public class D extends A {
    public void callProtectedMethod() {
        super.protectedMethod();
    }
}

final D record = new D();

record.callProtectedMethod();

Since A.method1() is protected, it is only accessible from same class/same package/child of A.

In your code, your are calling A.method1() in B, that is not accessible if B not in same package as A

The solution is using a wrapper as @Alex Ander or change modifier of A.method1() to public

Java 访问修饰符

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM