[英]Accessing public methods of a Private Inner Class, from outside the Enclosing class
我有以下代碼類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()方法。 做了一些搜索,發現這個鏈接,我想知道是否有更好/更簡單的方法這樣做?
這里至少有兩個問題:
Helper
不知道SpecificBehaviour
的存在,因為它是一個私人類。 它可能知道Behaviour
類,你沒有提供任何細節。 如果在Behaviour
聲明了getApple()
,並且如果Helper
可以看到Behaviour
,那么可見性部分不一定是個問題。 Helper
需要引用SpecificBehaviour
的實例,這意味着您需要實例化SpecificBehaviour
。 為此,您還需要一個Agent
實例,因為SpecificBehaviour
是一個內部類 。 目前尚不清楚你是否有這樣的實例。 基本上我認為私人內部階級的存在在這里增加了混亂。 如果你是Java的新手,我強烈建議你暫時堅持使用頂級課程。 他們周圍有一些微妙之處,最好一次嘗試學習一件事。
如果這沒有幫助,請提供更多背景信息 - 您的問題目前非常模糊。 您希望在哪里使用getApple
內Helper
? Helper
狀態的一部分應該是對SpecificBehaviour
實例的引用,還是應該是方法參數? 您是否創建了Agent
實例? Behaviour
什么樣的? 您可能會發現,在逐個回答這些問題的過程中,您可以更好地為自己找出問題所在。
-使用Composition
原理來訪問getApple()
方法。
例如:
public class Agent {
Apple a = new Apple(); // Agent class has a reference of type Apple.
.....
.....
}
-第二種方法是在Apple類中使getApple()
方法static
,然后使用Class name從Agent類訪問它.
(點)運算符。
例如:
public class Agent {
public void go(){
Apple.getApple();
}
.....
.....
}
您需要詢問您要傳遞給Helper
的Agent
對象,以獲取私有類SpecificBehaviour
的實例 。 這是它的工作方式。 封裝記得。
Jon Skeet表示,我完全同意:
Helper需要引用
SpecificBehaviour
的實例,這意味着您需要實例化SpecificBehaviour
。 為此,您還需要一個Agent
實例,因為SpecificBehaviour
是一個內部類。 目前尚不清楚你是否有這樣的實例。
實際上,通過測試下面的示例代碼,您可以了解您的嘗試有多奇怪:
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.