2016-07-20 18 views
-3

我有一个静态嵌套类StatClass,文件名是Example.javaStatic Nested 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();  
    } 
} 

第一个println语句,不能在IE静态嵌套类的工作,如果其取出那么程序编译,虽然println语句,工作时,POW()方法中,不明白这

+6

“此行不起作用”,因为它是一种方法外的声明。 –

+0

提示:在处理“内部课堂”之前,您可能想要真正涵盖必要的基础知识。 – GhostCat

+0

更确切地说:它是一个块*之外的语句*。 –

回答

4

就像一个普通的类,你不能只是把一个类的内部声明。你可以把它放在这样的初始化块中:

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

或者在构造函数或方法中。任何你想要的。

+0

谢谢,非常简洁,除了我的问题还清除了其他一些东西。 – Cloverr

1

我只是修炼两种答案至今:

一个选项是静态块

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 ^您好

+0

这不是一个“静态块”:它是一个实例初始值设定项。 –

+0

现在它是静态的:) –

+1

但是你不需要把它包装在一个静态块中。实例初始化器也可以工作。 –

0

下面的语句是不会工作

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

你有如下

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

此块将执行时JVM创建静态实例来包装静态块内的这些报表之外的方法。

+0

“你必须使用如下的静态块”不,你不需要;还有其他选择,取决于要求。 “当JVM创建静态实例时”,JVM不会创建“静态实例”。 –

+0

1:在运行时JVM将看到静态块或静态属性,它将分配内存给所有这些静态属性和块。这就是它如何在一开始就执行并且会随着该类的每个实例返回。 2:如果JVM不那么谁会? 这里有什么不对吗亲爱的? –

+0

1.但你不需要使用静态块。 2.没有“静态实例”这样的事情:JVM在加载类时执行静态块。 –

0
System.out.println("Hello"); 

这不起作用,因为控件永远不会行。除非你在函数内定义这个函数,并使用你创建的对象来调用它,或者使用不需要对象的静态块来调用它或初始化块,否则它将不起作用。我希望这可以帮助