Java类的修饰符

Java类的修饰符,java,swing,class,declaration,modifier,Java,Swing,Class,Declaration,Modifier,我正在尝试创建一个定制的JButton。我注意到,当我声明类MyButton扩展JButton时,它工作正常。但是当我将类名更改为私有类MyButton或保护类MyButton时,Eclipse显示了非法的修饰符错误 我知道在一个文件中只能将一个类声明为公共类,但是将其声明为私有类有什么错呢?有人能解释一下在这种情况下,不同的修饰符是如何作用于类的吗?谢谢 class MyButton extends JButton { @Override protected void paintComp

我正在尝试创建一个定制的JButton。我注意到,当我声明类MyButton扩展JButton时,它工作正常。但是当我将类名更改为私有类MyButton或保护类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);           
   }    
 }

顶级类只允许使用以下访问修饰符:

公共,使其可从任何地方访问 默认值/无,使其包专用,即仅对同一包中的类可见 从:

访问修改器public§6.6仅适用于顶级课程 §7.6和成员类别§8.5,而非本地类别§14.3或 匿名类§15.9.5

受保护和专用的访问修饰符§6.6仅适用于 直接封闭类或枚举声明中的成员类 §8.5

以及:

如果顶级类型声明包含 以下任一访问修饰符:受保护、专用或 静态的


因此,如果您想要两个在同一文件中声明多个顶级类,其中一个匹配源文件名的类必须标记为public,而其他类则需要具有默认的包私有访问权限。

尽管Java中有4个访问修饰符public、protected、default、private,您只能使用public或default作为最外层类顶级类的访问修饰符

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


想想这个。如果您将顶级类设置为私有,并且java允许,那么您可以从中获得什么好处?由于私有内容不能由除自身之外的任何其他地方访问,因此允许最外层类的私有访问修饰符没有任何意义

在您的示例中,我没有看到内部类…更不用说,您不会看到MyButton的任何文本或图标…这不是内部类!内部类应该在父类内部-CustomButton类在外部。感谢大家指出这一点!我对这个定义和类修饰符感到困惑。我已经编辑了这个问题。希望它现在读得更好。不,这里仍然没有看到内部类…也许你应该看看是的,我的意思是我发现一个文件中的两个类并不等于其中一个是内部类。我认为,内部类是指公共类中的一个私有类。我修改了这个问题,我想我应该把这个问题表述为:为什么我们不能在一个文件中声明public和另一个私有的、受保护的类。谢谢!或者,我可以在一个文件中声明一个公共类,并在其中嵌套私有类,这不会影响它们的行为?可以,但要注意声明它们为public/protected/private的效果。静态成员类的行为也不同于非静态成员类。该规范或任何体面的Java书籍都会为您提供所有细节。