如何解决如何执行在类内声明的函数public方法,而该类又在私有方法内?
因此,我想执行以下代码块的sum():
import java.lang.reflect.Method;
public class LocalOuterClass { // start of outer
private int x = 10;
private Object run() { //start of inner
class LocalInnerClass {
private int y = 20;
public void sum() {
System.out.println(x+y);
}
} //end of inner
LocalInnerClass lc = new LocalInnerClass();
//lc.sum();
return lc;
}
public static void main(String[] args) {
LocalOuterClass Loc = new LocalOuterClass();
Object obj = Loc.run();
System.out.println(obj.getClass());
Method[] methods = obj.getClass().getmethods();
for (Method method : methods) {
String MethodName = method.getName();
System.out.println("Name of the method: "+ MethodName);
}
}
} //end of outer
当我执行lc.sum()时,sum()被正确执行。但是,当我将内部类的对象返回给main()并尝试执行sum()时,会出现编译器错误。在对象上执行getClass()。getmethods()确实将sum()打印为方法之一。我该怎么办才能在main()中执行sum()?
解决方法
您必须将返回类型更改为LocalInnerClass
并将LocalInnerClass
移出方法:
public class LocalOuterClass {
private int x = 10;
private class LocalInnerClass {
private int y = 20;
public void sum() {
System.out.println(x + y);
}
}
private LocalInnerClass run() {
LocalInnerClass lc = new LocalInnerClass();
//lc.sum();
return lc;
}
public static void main(String[] args) {
LocalOuterClass Loc = new LocalOuterClass();
LocalInnerClass obj = Loc.run();
obj.sum(); // it works!
// ...
}
}
,
问题是您的LocalInnerClass
方法不了解整个main
。如果整个类型未知,则使用公共方法是没有帮助的。您需要重构代码以进行更改。
实际上,您的方法run
当前返回类型为Object
的值,并且您需要返回类型为LocalInnerClass
的值,但是由于类型可见性,这是不可能的。 / p>
基本上有两种选择。一种是将整个LocalInnerClass
移动到main
可见的位置(如oleg.cherednik建议):
class LocalOuterClass {
private int x = 10;
private LocalInnerClass run() { // now we can retun `LocalInnerClass`
return new LocalInnerClass();
}
public static void main(String[] args) {
new LocalOuterClass().run().sum(); // works!
}
private class LocalInnerClass {
private int y = 20;
public void sum() {
System.out.println(x+y);
}
}
}
另一种选择是实现/扩展具有sum
的其他类型,例如像这样:
class LocalOuterClass {
private int x = 10;
private Summable run() { //start of inner
class LocalInnerClass implements Summable {
private int y = 20;
public void sum() {
System.out.println(x+y);
}
}
return new LocalInnerClass();
}
public static void main(String[] args) {
new LocalOuterClass().run().sum(); // works as well
}
private interface Summable {
void sum();
}
}
使用此接口选项,LocalInnerClass
方法之外的任何人仍然看不到类型run
,但是Summable
接口却是因为您的LocalInnerClass
实现了Summable
您可以返回该类型的值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。