Java 类的修饰符
Posted
技术标签:
【中文标题】Java 类的修饰符【英文标题】:modifiers for Java classes 【发布时间】:2014-09-19 02:11:39 【问题描述】:我正在尝试创建一个自定义的 JButton。我注意到当我声明类class MyButton extends JButton
时,它工作正常。但是当我将类名更改为private class MyButton
或protect 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
/private
。 static
成员类的行为也不同于非静态的。规范或任何不错的 Java 书籍都会为您提供所有详细信息。【参考方案2】:
虽然 Java 中有 4 个访问修饰符 (public, protected, default, private
),您只能使用 public
或 default
作为最外层类的访问修饰符(***类)
如果类是内部类,您可以使用其他访问修饰符
考虑一下。如果您将最***的类设为私有并且 java 允许这样做,那么您可以从中获得什么好处?由于私有的东西不能被除自身以外的任何其他地方访问,因此没有必要为最外层的类允许私有访问修饰符
【讨论】:
以上是关于Java 类的修饰符的主要内容,如果未能解决你的问题,请参考以下文章
在Java和c#中如果不写访问修饰符,类和类成员默认的是啥访问修饰符?