【问题标题】:Why can't we have static outer classes [duplicate]为什么我们不能有静态外部类[重复]
【发布时间】:2013-08-03 19:27:41
【问题描述】:

为什么我们不能创建外部的静态类。我在这个社区阅读了这个问题的答案,但我没有得到完美的答案。有人能帮我一个准确的答案吗

   static class A
    {  
        void display()
        {
            System.out.println("This is a static class");  
        }

    }

【问题讨论】:

  • 因为java外层的静态类是没有意义的。你对它没有的外部静态类有什么期望?
  • 我不会因为 Java 中缺少这样的东西而苦恼。
  • 因为外部类本身是静态的,你不能定义一个非静态的外部类。所以外部类有static修饰符是没有用的。
  • 我感受到你的痛苦——在我看来,有一个 static 类暗示所有方法和所有子类都是 static 是有意义的,就像 final 类一样。
  • “静态”方法或字段不是由实例处理的,而是直接与类相关联。类似地,“静态”(内部)类的实例不与包含类的实例相关联(为了寻址包含范围的成员),而是直接与包含类相关联。当应用于外部类时,这个概念是没有意义的,因为没有“包含”范围可以链接。术语不会暗示类的所有成员都是static——静态内部类不是这种情况,也不应该是外部类。

标签: java static


【解决方案1】:

外部类实际上已经是static static 嵌套类意味着它没有对外部类的引用。外部类已经没有对另一个类的隐式引用。

【讨论】:

  • 我们能在静态块中找到复活类的踪迹吗? java是否有一个包含活动类/类名/类型的列表?
  • 无论是不是静态的,你都可以得到封闭类。嵌套的非静态类还具有对外部类实例的引用。
  • @Peter 我无法理解“外部类已经是有效静态的”这句话
  • 我纠正你:static 嵌套类意味着它没有引用外部类实例(对象)。因为内部类可以是静态的,只要它直接访问外部类的静态成员,或者它的字段成员,或者局部变量。
【解决方案2】:

静态类到底能做什么?它会是“所有实例的完全相同的实现”吗?想想看:)

【讨论】:

  • 你的意思是静态类对于在任何地方创建的每个实例都有相同的实现。
  • 没错,Any java 类对于它在任何地方创建的每个实例都有相同的实现,所以本质上,外部类都是静态类! :)
  • 似乎有点不正确。静态是指可用于变量或方法的内存的单个副本。它怎么可能是实现的一部分,外部类怎么可能都是静态类。
  • 任何给定的类只能有一个定义,因此它是“静态的”。 [静态] 类定义可以有多个实例化。 [静态] 单一实现定义存储在 Java 内存空间的 permgen 区域(JEP 122 之前)。
  • 我可以试试,我希望我有一个白板哈哈......'为什么我们不能有一个静态类?':你已经有了它们,所有外部类都已经像静态类一样。您希望哪些行为与它们的工作方式不同?也许我们可以引导您朝着正确的方向前进。您是否希望类中的所有字段都自动变为静态?
【解决方案3】:

因为这是没有意义和无用的。如果你想拥有静态对象,只需制作类的静态实例。如果您想调用类方法而不引用它的对象,只需将此方法设为静态即可。然后你将拥有:

class A
{  
   public static void display()
   {
      System.out.println("This is a static method");  
   }
}

您可以通过A.display();调用此方法。

【讨论】:

  • 你能用简单的语言解释一下'无意义和无用'吗?
  • 如果你想使用它的功能,只需将这个类设为静态对象即可。
【解决方案4】:

静态嵌套类只是工作中的命名空间。嵌套类在 enclosure 类中是名称范围的,您可以认为 outer 类已经存在于该包的根 namespace .

因此,不需要static 关键字,因为该类在中已经是全局的,并且如果public贯穿整个应用程序。

【讨论】:

  • 我可以这样说。对于静态类,分配了单个堆副本,其中创建的每个实例都分配在同一个堆中,这会降低应用程序的性能。它只是一个想法。可能完全无效
  • 不确定您的确切思路是什么,但静态嵌套类在编译或运行时没有得到特殊处理(类包命名空间除外)。编译器创建一个单独的.class 文件,就像它自己定义的类一样。因此,JVM 也会为它创建一个单独的Class 对象实例。所以,它与两个类没有什么不同,一个定义在一个包中,另一个没有。
  • 请不要使用嵌套类。我的意思是完全在外部类
  • 但是,外部类不是静态的。或者,换句话说(如果你认为它们是“静态的”),它们都被同等对待。所以,我仍然不确定你的意思是什么,“对于静态类,分配了一个堆的副本”。
  • 把堆看作是全局的;一个地址空间。因此,对于类的每个对象实例,都会分配一些堆内存(而不是认为“分配了堆的副本”)。类本身也将为其Class 对象(您从Class.forName() 获得的对象)分配一些堆内存;它是否是静态的并不重要。这也适用于它的对象实例。例如,在迭代 Map 时,您会得到静态嵌套的 Map.Entry 类对象;全部分配在堆上。
【解决方案5】:

Java 中没有外部静态类。 因为所有外部类都已经像 static 修饰符一样可见了。

但是你的意思是,你不想需要类的实例,你可以简单地将类中的所有方法和变量设为静态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 2010-11-01
    • 2015-02-14
    • 1970-01-01
    • 2018-09-20
    • 2013-09-15
    • 1970-01-01
    相关资源
    最近更新 更多