Java访问说明符问题

时间:2018-01-12 21:49:05

标签: java access-specifier

我对Java中的访问说明符感到困惑。我在Java中有一个包含2个不同包的代码。但是每次运行它都会显示错误..这里是该类的代码,它是使用从另一个包导入来调用该类..

package p2;

import p1.Testing;

class Pqr extends Testing{ // extending the class 
    void hey(){
        System.out.println("Something");
    }
}

class Xyz{
    public static void main(String args[]){
    Pqr t1 = new Pqr(); // Class from another package.
    System.out.println(t1.find("Mississippi","p"));
    t1.hey();
    }
}

从包p1 ..

继承的类的代码
package p1;
class Testing{
    protected static boolean find(String a,String b){ // Protected specifier
        boolean ans = false;
        for(int i=0;i<a.length();i++){
            String m = a.charAt(i) + "";
            if( m.equals(b)){
                ans = true;
            }
        }    

    return ans;
}

    public static void main(String args[]){

    // Main Class

    }

}

但是当我运行代码时出现错误&#34;测试在p1中不公开;无法从外部包裹访问&#34; ..

我在这个帖子中了解到,我们可以在不同的包之间使用protected方法,但是可以通过另一个类扩展它。In Java, difference between package private, public, protected, and private

提前致谢。

1 个答案:

答案 0 :(得分:1)

您无法访问顶级类(在您的情况下是Testing),因此无论访问修饰符是什么,您都无法访问其成员。您需要公开Testing以使其受保护的成员从其包的外部可见到扩展Testing的类。您可以在Java教程中阅读更多相关信息。以下是关于Testing类的访问修饰符的部分:

可以使用修饰符public声明一个类,在这种情况下,该类对所有类都可见。如果一个类没有修饰符(默认值,也称为包私有),它只在其自己的包中可见

关于find()方法的部分:

protected修饰符指定只能在自己的包中访问该成员(与package-private一样),此外,还可以在另一个包中使用其类的子类。

但是为了利用另一个包中包含的类的protected成员,包含它的类本身需要在另一个包中可见(它需要是public)。

有关访问修饰符的更多信息,请查看此Java教程: https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html