我有一个没有修饰符(默认)的类,它有一个名为 mymeth 的公共方法。我知道当我在包中时可以访问该方法。但是,当我在包外时,我想访问该方法。有没有人对如何做到这一点有想法。从理论上讲,我认为这应该是可能的,因为公共方法意味着世界可以访问。这是我的类和方法的示例:
class myclass{
public void mymeth(int i,int b){
.....
}
}
设置myclass
类为public
。
**仅供参考,Java 中的类从大写字母开始
Set myclass
as public
then put it in the build path of the class you need to use myclass
.
直接你不能。'public' 让一切都可见。但是如果你看不到类,就很难调用任何东西。然而,
您可以使用公共类扩展默认类,最终暴露 myMeth。
PubClass.java
package p1;
class DefClass{
public void myMeth(){
System.out.println("from myMeth!");
}
}
public class PubClass extends DefClass{
public PubClass(){
super();
}
}
主类.java
package p2;
class MainClass {
public static void main(String[] args) {
p1.PubClass pub = new p1.PubClass();
pub.myMeth();
}
}
输出:
from myMeth!
一个真正的实际用途是覆盖该隐藏类中的公共已知方法。您可以在隐藏类中实现公共方法,因此世界可以调用您的公共方法(而不是公共实现)而不会暴露该类。例如 Object 类的公共方法在这里被 DefClass 覆盖:
PubClass.java
package p1;
class DefClass{
public String toString(){
return "DefClass here. Trying to explain a concept.";
}
}
public class PubClass extends DefClass{
public PubClass(){
super();
}
}
主类.java
package p2;
class MainClass {
public static void main(String[] args) {
p1.PubClass pub = new p1.PubClass();
System.out.println(pub.toString());
}
}
输出:
DefClass here. Trying to explain a concept.
public interface SomeInterface{
public void mymeth();
}
class MyClass implements SomeInterface{
public void mymeth(){
}
}
//is in the same package as MyClass
public MyClassFactory{
public SomeInterface create(/*parameters*/){
//create instance from parameters
//For your case
MyClass instanceOfAnyClassThatImplementsSomeInterface = new MyClass(/*pass the parameters*/);
return instanceOfAnyClassThatImplementsSomeInterface;
}
}
其中一种方法已经在答案中定义,但是如果您想限制类的公共访问,那么您可以创建一个接口并通过它访问该方法。
考虑创建另一个与 MyClass 具有相同包名的公共类 MyChild 并从 MyChild 类公开方法
public class MyChild extends MyClass {
public void myTestMethod(){
super.myTestMethod
}
}
现在在您要使用该方法的类中,只需使用 MyChild 类的实例
MyChild m = new MyChild();
m.myTestMethod();
干杯:)
在您的代码中,myclass
具有默认(包级别)访问修饰符。应该使用public
访问修饰符声明它,以便在其包之外可以访问它。有关详细信息,请阅读有关在 Java 中控制访问的更多信息。
作为旁注,Java 标准要求您将类名中的每个单词大写,因此您应该使用MyClass
. 我向您推荐Java 约定文档。