我有以下代码类Agent.java:
public class Agent {
Helper helper ;
private class SpecificBehaviour extends Behaviour{
private Apple a;
public SpecificBehaviour(Apple a){
setApple(a);
}
public void setApple(Apple a){
this.a=a;
}
public Apple getApple(){
return a;
}
}
public void someMethod(){
helper = new Helper(this);
}
}
在Helper.java(同一个包中的另一个类)中,我想访问getApple()方法。做了一些搜索并找到了这个link 我想知道是否有更好/更简单的方法吗?
答案 0 :(得分:4)
这里至少有两个问题:
Helper
不知道SpecificBehaviour
的存在,因为它是私人类。它可能可能知道Behaviour
类,你没有提供任何细节。如果在getApple()
中声明了Behaviour
,并且Behaviour
对Helper
可见,则可见性部分不一定是个问题。Helper
需要引用SpecificBehaviour
的实例,这意味着您需要实例化SpecificBehaviour
。为此,您还需要Agent
的实例,因为SpecificBehaviour
是内部类。目前尚不清楚你是否拥有这样的实例。基本上我认为私有内部类的存在会增加混乱。如果你是Java的新手,我强烈建议你暂时坚持使用顶级课程。他们周围有一些微妙之处,最好一次尝试学习一件事。
如果这没有帮助,请提供更多背景信息 - 您的问题目前很模糊。 哪里您想在getApple
中使用Helper
?部分Helper
状态应该是SpecificBehaviour
实例的引用,还是应该是方法参数?您是否创建了Agent
的实例? Behaviour
看起来像什么?您可能会发现,在一次回答这些问题的过程中,您可以更好地为自己找出问题。
答案 1 :(得分:0)
- 使用Composition
原则来访问getApple()
方法。
<强>例如强>
public class Agent {
Apple a = new Apple(); // Agent class has a reference of type Apple.
.....
.....
}
- 第二种方法是在 Apple类中制作getApple()
方法static
,然后从代理类访问它使用带有.
(点)运算符的类名。
<强>例如强>
public class Agent {
public void go(){
Apple.getApple();
}
.....
.....
}
答案 2 :(得分:0)
您需要向私人班级Agent
的实例询问您传递给Helper
的{{1}}个对象。这是它的工作方式。封装记得。
答案 3 :(得分:0)
Helper需要引用
SpecificBehaviour
的实例, 这意味着您需要实例化SpecificBehaviour
。为了那个原因, 你还需要一个Agent
的实例,因为SpecificBehaviour
是一个。{1}} 内心阶级。目前尚不清楚你是否有这样的实例。
实际上,通过测试下面的示例代码,您可以了解您的尝试有多奇怪:
<强> Agent.java 强>
public class Agent
{
private class SpecificBehaviour
{
public String toString()
{
return "specific behaviour";
}
}
public Class getInner()
{
return SpecificBehaviour.class;
}
}
<强> Helper.java 强>
public class Helper
{
public static void main(String[] args)
{
try
{
Agent agent = new Agent();
System.out.println(agent.getInner().newInstance().toString());
}
catch (InstantiationException e) { e.printStackTrace(); }
catch (IllegalAccessException e) { e.printStackTrace(); }
}
}
上面的代码编译得很好。让我们看看输出是什么:
java.lang.InstantiationException: Agent$SpecificBehaviour
at java.lang.Class.newInstance0(Class.java:340)
at java.lang.Class.newInstance(Class.java:308)
at Helper.main(Helper.java:5)