2013-06-26 24 views
-4
class B { 

    private B() {} 

    public void test() { 
     System.out.println("hello"); 
    } 
} 

public class A { 
    public static void main(String[] args) {} 
} 
+0

問題是什麼?添加一些問題的文本表示並設置你的代碼的格式,那麼這裏的專家肯定會提供答案 –

+0

你需要B的構造函數的「私有」可見性嗎? –

+0

請告訴我,如果有任何方法在相同的代碼中調用該方法。 – aaa1

回答

0

選項1(改變類的構造函數需要簽字):充分利用構造方法的類B,四通八達,即private。然後,創建的B一個實例,並調用方法:

public static void main(String[] args) { 
    B b = new B(); 
    b.test(); 
} 

選項2(改變方法需要簽名):使test()方法static

public static void test() { 
    System.out.println("hello"); 
} 

然後,你可以調用沒有事先實例化:

public static void main(String[] args) { 
    B.test(); 
} 

選項3(無需更改代碼需要):使用反射

method = B.getClass().getDeclaredMethod("test"); 
method.setAccessible(true); 
method.invoke(object); 
+1

'B'的構造函數是私有的! – NINCOMPOOP

+1

B()是私人的 – Parth

+0

我也回答了。 – darijan

0

你在這裏創造一個私有的構造,這意味着你cna't B級製作外isntantiate B類它public然後弗洛darijan的回答

class B { 

    public B() {} 

    public void test() { 
     System.out.println("hello"); 
    } 
} 

public class A { 
    public static void main(String[] args) { 
     B b = new B(); 
     b.test(); 
    } 

    } 
+0

他不能使用Reflection調用該方法嗎? – NINCOMPOOP

+0

新白癡,抱歉不知道我們可以用反射來做到這一點。 –

+0

我之前有過seens darijan的回答,他在我發佈之後編輯了'private'構造函數,我只是添加了'private'部分,並且信譽已經提供給darijan進行實例化。 –

0

,如果你想訪問你的測試方法,你不能實例化一個ClasB,因爲它有私有的構造函數將構造函數更改爲public。如果這不是您的要求
1.如果您的測試方法定義是不是一個對象取決於您可以訪問使用reflection
或者
2.方法,可以使靜態方法和訪問,通過類名

1

由於test是一個實例方法,所以您需要使用類B的對象調用該方法。您已將類B的構造函數聲明爲private,因此您將無法使用new運算符在類B之外創建B對象。您可以使用反射:

Constructor<B> constructor=B.class.getDeclaredConstructor(); 
constructor.setAccessible(true); 
B b = constructor.newInstance(); 
b.test(); 
+0

這是一個新的東西要學習:)謝謝你:) upvote from me –