静态嵌套class 不能使用打印

Static nested class can't use print

我有一个静态嵌套的class 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 语句在静态嵌套 class 中不起作用,即如果将其删除,则程序会编译,尽管 println 语句在 pow() 方法内部时有效,无法理解这个

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

一个选项是静态块

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 执行块的方式。在第一种情况下,它在 class 初始化期间执行一次。然后输出将是:

Hello Hello W Hello W

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

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();
    }
 }

那么输出将是:

Hello Hello W Hello Hello W

就像在正常的 class 中一样,您不能只将语句放在 class 中。你可以把它放在这样的初始化块中:

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

或者在构造函数中,或者方法中。随便你。

以下语句是行不通的外部方法

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

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

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

此块将在 JVM 创建静态实例时执行。

 System.out.println("Hello");

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