Java 类的修饰符

Posted

技术标签:

【中文标题】Java 类的修饰符【英文标题】:modifiers for Java classes 【发布时间】:2014-09-19 02:11:39 【问题描述】:

我正在尝试创建一个自定义的 JButton。我注意到当我声明类class MyButton extends JButton 时,它工作正常。但是当我将类名更改为private class MyButtonprotect class MyButton 时,Eclipse 显示“非法修饰符”错误。

我知道在一个文件中只能将一个类声明为公共类,但是将其声明为私有类有什么问题?有人可以帮助解释在这种情况下不同的修饰符如何为类工作吗?谢谢!

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);           
       
 

【问题讨论】:

我在您的示例中没有看到内部类...更不用说您的MyButton 中看不到任何文本或图标... 这不是内部类!内部类应该在父类内部 - 你的 CustomButton 类在外部。 感谢大家指出这一点!我对那个定义和类修饰符感到困惑。我已经编辑了这个问题。希望它现在读得更好。 不,这里仍然看不到内部类...也许你应该看看Classes and Objects, inner classes 是的,我的意思是我发现一个文件中的两个类不等于“其中一个是内部类”。我认为内部类是指公共类中的一个私有类。我修改了问题,我想我应该将问题表述为:为什么我们不能在一个文件中声明公共和另一个“私有、受保护”类。 【参考方案1】:

***类允许的唯一访问修饰符是:

public,可随时随地访问 (默认/无),使其成为包私有,即仅对同一包中的类可见

来自Java language specification:

访问修饰符 public(第 6.6 节)仅适用于***类 (§7.6)和成员类(§8.5),而不是本地类(§14.3)或 匿名类(§15.9.5)。

访问修饰符 protected 和 private (§6.6) 仅适用于 直接封闭类或枚举声明中的成员类 (§8.5)。

还有also:

如果***类型声明包含 以下任一访问修饰符:protected、private 或 静态的。

因此,如果您希望两个在同一个文件中声明多个***类,则必须将其中一个(与源文件名匹配的那个)标记为public,而其他则需要具有默认值(包私有)访问。

【讨论】:

谢谢!或者我可以在文件中声明一个公共类并在其中嵌套私有类,这不会影响它们的行为? 你可以,但要注意声明它们的影响public/protected/privatestatic 成员类的行为也不同于非静态的。规范或任何不错的 Java 书籍都会为您提供所有详细信息。【参考方案2】:

虽然 Java 中有 4 个访问修饰符 (public, protected, default, private),您只能使用 publicdefault 作为最外层类的访问修饰符(***类)

如果类是内部类,您可以使用其他访问修饰符

考虑一下。如果您将最***的类设为私有并且 java 允许这样做,那么您可以从中获得什么好处?由于私有的东西不能被除自身以外的任何其他地方访问,因此没有必要为最外层的类允许私有访问修饰符

【讨论】:

以上是关于Java 类的修饰符的主要内容,如果未能解决你的问题,请参考以下文章

在Java和c#中如果不写访问修饰符,类和类成员默认的是啥访问修饰符?

C#中类。方法。字段 的默认访问修饰符分别是啥?

Java修饰符

Java 类的修饰符

在Java和c#中如果不写访问修饰符,类和类成员默认的是啥访问修饰符?

java9-7 成员内部类的修饰符