【问题标题】:Why can't java main class be protected?为什么java主类不能被保护?
【发布时间】:2011-04-12 00:19:18
【问题描述】:

我可以使用访问说明符“public”或默认创建主类。

但是为什么我不能使用受保护的方式创建。作为默认本身允许为什么不保护。

公开:

public class MainClass {
 public static void main(String[] args) {
 }
}

默认值:

class MainClass {
 public static void main(String[] args) {
 }
}

受保护:

protected class MainClass {
 public static void main(String[] args) {
 }
}

显示错误: MainClass 类的非法修饰符;只允许 public、abstract 和 final MainClass.java SCJP/src line 1 Java Problem

【问题讨论】:

  • 基本上public 表示该类在其包外部 可见,而defaultpackage 范围意味着它仅可见到同一包内的其他类。要保护的顶级类型的语义是什么?因为protected 通常指的是继承的特性(只对子类可见),所以它只对内部类有意义。

标签: java


【解决方案1】:

通过将封闭类设置为受保护的方式,您是否会影响 main 方法的可见性?
据我所知,要使 main 方法可访问,您需要确保两件事:

  1. 封闭类是公共的。 (我认为它也可以是默认的)
  2. 封闭类和父文件同名。

希望这会有所帮助:)

【讨论】:

  • (1) 由于封闭类必须是顶级的,它只能是公共的或包私有的。两者都有效。 (2) 封闭类不必与父文件同名。
  • 正如你所说的封闭类可以是公共的或默认的。但受保护的是黑白公共和默认写入。那么为什么我们不能假设使用它..
  • @santose:受保护的只有该班级的孩子才能看到。主类是程序的入口点,执行开始的地方,所以它必须是公共的。只有这样,外部实体(即他们的系统)才能看到并使用它。
  • @Sagar V,系统 - 也称为 JRE - 可以看到所有内容 - 公开的、受保护的、包私有的和私有的。我不明白为什么你不能实现一个接受私有 main 方法的 JRE。所以这些东西是任意的。
  • @Sagar V,你的想法是正确的,默认类是如何工作的。默认类的特权低于受保护的仪式..
【解决方案2】:

protected 或 private 类没有意义 - 作为顶级类,而不是内部类。这样的类将无法使用。受保护的意思是,类中的元素可以被孩子看到。但是,如果整个班级都是打包的呢?在这种情况下,任何其他类甚至可以看到这样的类(即使在同一个包中),直到它扩展了这样的类。这会很奇怪,这就是它被禁止的原因。

【讨论】:

    【解决方案3】:

    protected 涉及为包含类型的子类提供对成员的访问权限。这里没有包含类型,那是什么意思?

    请注意,这与main 无关......它适用于任何顶级类。 对要保护的嵌套类型有效:

    public class Foo {
        protected static class Bar{}
    }
    

    这允许Foo 的子类访问Bar

    【讨论】:

    • 什么是包含类型的意思?你能举例说明为什么我们不能对顶级类使用protected。我知道顶级类不是私有的,因为我们不能创建该类的对象所以没有有道理。
    • @AppKart:包含类型与包含其他类型的类型相同——因此Bar 的包含类型为Foo。基本上,对于类的 any 成员,protected 授予包含该成员的类的子类对该成员的访问权限。但是顶级类不是任何类的成员。
    猜你喜欢
    • 2015-10-04
    • 1970-01-01
    • 2011-04-21
    • 2014-05-16
    • 1970-01-01
    • 2011-12-30
    • 2013-03-05
    相关资源
    最近更新 更多