2014-09-19 112 views
2

我正在嘗試創建一個自定義的JButton。我注意到,當我聲明類class MyButton extends JButton時,它工作正常。但是當我將類名更改爲private class MyButtonprotect class MyButton時,Eclipse顯示「非法修飾符」錯誤。Java類的修飾符

據我所知,只有一個類可以在一個文件中聲明爲public,但是將其聲明爲私有類有什麼問題?有人可以幫助解釋這種情況下不同的修飾符如何用於類?謝謝!

class MyButton extends JButton { 
@Override 
    protected void paintComponent(Graphics g){ 
     Graphics2D g2d =(Graphics2D)g; 
     g2d.setColor(new Color(200,50,50,255)); 
     g2d.fill(new RoundRectangle2D.Float(0,0,getWidth(),getHeight(),100,100)); 
    } 
} 
public class CustomButton extends JFrame{ 
    public CustomButton(){ 
     add(new MyButton()); 
    } 
    public static void main(String[] args) { 
     CustomButton b = new CustomButton(); 
     b.setVisible(true);   
    }  
} 
+0

我沒有在您的示例中看到內部類......更不用說了你不會看到任何帶有你的'MyButton'的文字或圖標... – MadProgrammer 2014-09-19 02:13:49

+0

這不是內在的課堂!內部類應該在父類中 - 你的'CustomButton'類是外部的。 – 2014-09-19 02:18:32

+0

謝謝你們指出這一點!我很困惑那個定義和類修飾符。我編輯了這個問題。希望它現在讀得更好。 – stillAFanOfTheSimpsons 2014-09-19 02:26:38

回答

4

所允許的頂級類的唯一訪問修飾符是:

  • public,使得它在任何地方
  • (缺省的/無),使其包私有,即訪問只有在同一個包中的類可見

Java language specification

訪問修飾符public(§6.6)僅適用於頂級類 (§7.6)和成員類(§8.5),而不適用於本地類(§14.3)或 匿名類(§15.9.5) 。

受保護和私有訪問修飾符(第6.6節)僅適用於 成員類在直接包含的類或枚舉聲明 (第8.5節)中。

而且also

這是一個編譯時錯誤,如果一個頂級類型聲明包含 以下訪問修飾符中的任何一個:保護私人或 靜態的。

所以,如果你希望兩個在同一文件中聲明多個頂級類,其中一人(一個相匹配的源文件名)將被標記public,而其他人則需要有默認(包私有)訪問。

+0

謝謝!或者其他方式,我可以在文件中聲明一個公共類並在其中嵌入私有類,並且不會影響其行爲? – stillAFanOfTheSimpsons 2014-09-19 03:12:01

+0

你可以,但要意識到聲明它們是「public」/「protected」/「private」的效果。同樣,'static'成員類的行爲與非靜態成員類有所不同。該規範或任何體面的Java書會給你所有的細節。 – 2014-09-19 03:16:42

0

雖然有4個訪問修飾符在Java中(public, protected, default, private),只能使用兩種publicdefault作爲訪問修飾符到最外部類(頂層班)

您可以使用其他訪問修飾符如果這個班級是內部班級

想想這個。如果你創建了最頂級的私有類,並且如果Java允許的話,那麼你可以從中獲得什麼好處?由於私人東西不能通過任何其他地方訪問,除了其本身之外,沒有允許最外層類別的私人訪問修飾符的要點