【问题标题】:Java access specifier issue [duplicate]Java访问说明符问题[重复]
【发布时间】:2018-06-22 09:35:59
【问题描述】:

我对 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

    }

}

但是当我运行代码时,我收到一个错误“测试在 p1 中不公开;无法从外部包访问”..

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

提前致谢。

【问题讨论】:

  • public class Testing .. 你的 CLASS 本身是不公开的。
  • 您没有从子类调用方法。您只是在子类的 一个实例 上调用它。除了它是静态的,所以你也没有真正这样做。 t1.find(...) 等同于调用 Testing.find(...) 令人困惑。
  • @AniketSahrawat 先生,我在线程中读到了这篇文章,您可以使用受保护的说明符在包外使用方法..
  • @AkshitGupta 仅来自子类。 Xyz 不是Testing 的子类,因此protected 不授予访问权限。只有public 会。
  • @Andreas Sir,类 pqr 扩展了测试,使其成为测试的子类。我可以在这个类中调用测试方法吗?

标签: java access-specifier


【解决方案1】:

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

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

关于你的find() 方法的部分:

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

但是要使用另一个包中包含的类的protected成员,包含它的类本身需要在另一个包中可见(它必须是public)。 p>

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

【讨论】:

    猜你喜欢
    • 2011-01-31
    • 2014-09-09
    • 2012-04-09
    • 2016-05-23
    • 2014-01-08
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    相关资源
    最近更新 更多