2011-10-08 25 views
4

我給出了一個具有私有方法的類setCoors(int x,int y)。該類的構造函數也有setCoors。在另一個類中,我想要一個調用setCoors的方法setLocation。這可能嗎?如何在Java中使用私有方法

新問題:

如果我不允許的方法設置爲公開,這可能嗎?

public class Coordinate{ 
    public Coordinate(int a, int b){ 
     setCoors(a,b) 
    } 
    private void setCoords(int x, int y) 
} 

public class Location{ 
    private Coordinate loc; 
    public void setLocation(int a, int b) 
     loc = new Coordinate(a,b) 
} 
+3

@RayToal - 你正在做一些大的假設。鑑於他不瞭解整個公衆與私人事物,我懷疑他的班級是否已經完成了反思。當然,這也是一個假設......只是稍微小一點,因爲他說明了構造函數調用私有方法...;) –

+0

@Brian我同意,是的,「否」的答案更有幫助,因爲你'正確的問題來自Java開始的上下文。我並不反對將其他訪問者的答案留在頁面上,但如果有共識,它不屬於我可以撤回它。儘管如此,我仍然無法確定_best_答案是否是合格的否;就像「沒有你不能,只有這樣 - 這是一個非常複雜的後門,可以讓你做到這一點,但除了這些邪惡的黑客,沒有人會這樣做,你可以稍後再學習......」或者也許不是。 :) –

回答

4

不,private表示該方法只能在定義它的類的內部調用。您可能希望setLocation創建setCoords類的新實例,或者更改setCoords的可見性。

編輯:您已發佈的代碼將工作。請注意,Location類的任何實例都將綁定到它自己的Coordinate對象。如果在代碼的其他位置創建新的Coordinate對象,則無法修改其內部狀態。換句話說,行

Coordinate myCoord = new Coordinate(4, 5); 

將創建對象myCoord這將永遠有座標45

+0

因此,如果我不允許setColors公開。然後在setLocation中,我做這樣的事情:setLocation(int a,int b){coords = new Coordinate(a,b)?假設setCoords爲座標類 – Dan

+0

是的,假設這是你想要的。沒有看到課堂設計,很難說這是否是解決問題的正確方法。 – brc

4

private意味着它私人

如果希望其他類調用它,也許你不應該讓私人?

+0

正如@丹在回答我的回答時所說的,他無法改變'setCoords'方法的可見性。 – brc

+0

不正確。它可以通過反射進行訪問。他沒有問他是否應該,他問他是否可以。現在我完全同意你應該告訴他他不應該這樣做,但這並不能改變這個事實,即正確答案是「是,但是......」 – CorayThan

3

沒有private方法不能在定義它們

1

private意味着你只能訪問它定義的類中的類外部訪問。

4

最好和最有用的答案取決於問題的上下文,我相信這並不是完全明顯。

如果問題是關於意圖意圖的私人問題的新手問題,那麼答案「否」是完全合適的。這就是:

A的
  • 私有成員只能在類都可以訪問A的
  • 包私有成員只能在在A的包裝類訪問
  • A的保護成員只能在在A的類訪問A的公共成員和子類A
  • A的公共成員可在任何地方訪問A可見。

現在,如果了,還好,也許這是一個拉伸(謝謝你,布萊恩:)),這個問題從一個更「高級」的上下文來了,其中一個正在考慮的「我知道私人問題意味着私密但是有語言漏洞「,那麼,那麼就是這樣的漏洞。它是這樣的:

import java.lang.reflect.Field; 
import java.lang.reflect.Method; 
import java.util.Arrays; 
import java.util.List; 

class C { 
    private int x = 10; 
    private void hello() {System.out.println("Well hello there");} 
} 

public class PrivateAccessDemo { 
    public static void main(String[] args) throws Exception { 
     C c = new C(); 
     List<Field> fields = Arrays.asList(C.class.getDeclaredFields()); 
     for (Field f: fields) { 
      f.setAccessible(true); 
      System.out.println(f.getName() + " = " + f.get(c)); 
     } 
     List<Method> methods = Arrays.asList(C.class.getDeclaredMethods()); 
     for (Method m: methods) { 
      m.setAccessible(true); 
      m.invoke(c); 
     } 
    } 
} 

輸出:

x = 10 
Well hello there 

當然,這真的不是應用程序的程序員會做什麼。但事實上,這樣的事情可以完成是值得的知道,而不是應該忽略的東西。恕我直言,無論如何。

+0

說真的,你會「幫助」一個不瞭解公共和私人的反思的學生嗎? –

+0

哈哈太有趣了。雷是對的,但我認爲布萊恩更爲正確。 ;)「不」是一個更好的答案。 :) –

+0

實際上,沒有辦法從問題中看出學生不瞭解公立與私立。這可能是一個高級班的研究問題。但你的問題是公平的。我將限定答案,謝謝。 –

2

孩子做作業:答案是否定的。男人需要一些瘋狂的工作:答案是肯定的。更重要的是,你的setCoors方法不應該帶int參數。它應該需要兩個SilverBullet對象。