【问题标题】:Static nested class can't use print静态嵌套类不能使用打印
【发布时间】:2016-07-20 11:11:37
【问题描述】:

我有一个静态嵌套类StatClass,文件名为Example.java

class OuterClass
{
    public static class StatClass 
    {
        System.out.println("Hello"); // This line doesn't work
        void pow()
        { System.out.println("Hello W");}
     }      
}
public class Example
{
   public static void main(String[] args)
   {
    OuterClass.StatClass statInner1 = new OuterClass.StatClass();
    statInner1.pow();      
    }
 }

第一个 println 语句在静态嵌套类中不起作用,即如果将其删除然后程序编译,虽然 println 语句在 pow() 方法中起作用,但无法理解这一点

【问题讨论】:

  • “这一行不起作用”,因为它是一个方法之外的语句。
  • 提示:在处理“内部类”之前,您可能需要真正了解基本的基础知识。
  • 更准确地说:它是一个块外的语句。
  • @GhostCat ... 其中包括告诉 OP 正确的术语:这不是 内部类。它只是一个静态嵌套类。内部类不是静态的。
  • @Seelenvirtuose Uups。正确的;好收获!

标签: java inner-classes


【解决方案1】:

就像在普通类中一样,您不能只将语句放在类中。你可以像这样把它放在一个初始化块中:

{
    System.out.println("Hello");
}

或者在构造函数中,或者在方法中。随心所欲。

【讨论】:

  • 谢谢,非常简洁,除了我的问题还清除了其他一些东西。
【解决方案2】:

到目前为止,我只是将两个答案结合起来:

一个选项是一个静态块

class OuterClass
{
    public static class StatClass 
    {
         static {
        System.out.println("Hello"); // This line doesn't work
        }
        void pow()
        { System.out.println("Hello W");}
     }      
}
public class Example
{
   public static void main(String[] args)
   {
    OuterClass.StatClass statInner1 = new OuterClass.StatClass();
    statInner1.pow();     
    OuterClass.StatClass statInner2 = new OuterClass.StatClass();
    statInner2.pow();
    }
 }

主要区别在于 JVM 执行块的方式。在第一种情况下,它在类初始化期间执行一次。然后输出将是:

你好 你好W 你好W

另一个选项是初始化块,在这种情况下,代码将在类的每个实例化时执行。

class OuterClass
{
    public static class StatClass 
    {
     {
        System.out.println("Hello"); // This line doesn't work
        }
        void pow()
        { System.out.println("Hello W");}
     }      
}
public class Example
{
   public static void main(String[] args)
   {
    OuterClass.StatClass statInner1 = new OuterClass.StatClass();
    statInner1.pow();     
    OuterClass.StatClass statInner2 = new OuterClass.StatClass();
    statInner2.pow();
    }
 }

那么输出将是:

你好你好W你好你好W

【讨论】:

  • 这不是一个“静态块”:它是一个实例初始化器。
  • 现在是静态的 :)
  • 但是您不需要将其包装在静态块中。实例初始化器也可以工作。
  • 我不确定询问的人是否对差异有任何想法。他只是想让它发挥作用。
  • @AlexanderPetrov 我不同意。特别是对于初学者来说,尽可能精确是非常重要的。照顾好术语和句子是一个很好的答案。
【解决方案3】:

以下语句是不起作用的外部方法

System.out.println("Hello"); // This line doesn't work

您必须将这些语句包装在静态块中,如下所示

static{
     System.out.println("Hello"); // This line will work
}

这个块会在JVM创建静态实例时执行。

【讨论】:

  • "你必须按如下方式使用静态块" 不,你不需要;存在其他选项,具体取决于要求。 “当 JVM 创建静态实例时”JVM 不会创建“静态实例”。
  • 1:在运行时,当 JVM 看到静态块或静态属性时,它会为所有这些静态属性和块分配内存。这就是它在最开始时的执行方式,并将与该类的每个实例一起返回。 2:如果 JVM 没有,那么谁会呢?亲爱的,这里怎么了?
  • 1.但是您不需要使用静态块。 2、不存在“静态实例”:类加载时JVM执行静态块。
  • 1:为什么我们不需要静态块?如何在没有静态块的情况下在方法外部和类内部编写一些语句? 2:是的,这就是我的意思,不幸的是我的话和你的不符。
  • @Andy 在“措辞”元素上放轻松。从你的名字来看,英语是你的母语。与您相比,我们可能看不到语言的细微变化。不要太专注于措辞并暗示我们有与你不同的东西。情况并非如此。
【解决方案4】:
 System.out.println("Hello");

这不起作用,因为控件永远不会上线。除非您在函数中定义 this 并使用您创建的对象来调用它或使用不需要对象调用它的静态块或初始化程序块,否则它将不起作用。希望对你有帮助

【讨论】:

    猜你喜欢
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2011-10-23
    相关资源
    最近更新 更多