2017-06-16 37 views
-1

我在理解java中的任何语句都应该在代码块中。 但我在下面的代码中看到System.getenv();不在代码块中。但是如果我在它下面放置一个System.out.println(),编译器会抱怨。 System.getenv()在这里被视为声明而不是声明?Java系统的外部代码块

package gov.ssa.epa; 

public class AdvJ { 

    private static final Map<String, String> INVALID_FILTER_KEY = System.getenv(); 

    System.out.println("hello"); 

    public static void main(String[] args) { 


    } 
+0

该类型的静态分配是合法的。它与'private static int x = 5;'没有什么不同;'任何给定的任意语句可能都不会。 – CollinD

+1

内联初始化允许在代码块之外,但是'System.out.println(“hello”);'不是初始化语句 – JonK

+0

[Java™教程:初始化字段](https://docs.oracle.com /javase/tutorial/java/javaOO/initial.html) –

回答

0

System.getenv()不是一个语句,它是一个初始化表达式,用作字段声明的一部分。在任何方法之外的上下文中允许字段声明 - 事实上,这是字段声明唯一可以去的地方。初始化表达式附加到声明中,所以自然也允许它们。另一方面,

System.out.println不是一个声明,所以它不允许超出函数或初始化块。

+0

我认为System.getenv()是一个语句。只是语句被允许作为初始化表达式的一部分? – Sam

+0

@Sam不要想,看看它。你错了。 –

+0

我确实看过,我只是很有礼貌。来自维基百科 - *在计算机编程中,一个语句是命令式编程语言中最小的独立元素,它表达了要执行的一些操作。* 获取环境似乎与此描述相匹配,不是吗? 某些类型的语句是断言,赋值,转到,返回和(在这种情况下)**调用**。 – Sam

-1

这是因为private static final Map INVALID_FILTER_KEY = System.getenv()是一个私有类实例变量。这些实例变量可以在类中的任何位置使用,因此可以在任何方法之外声明。在方法中声明的变量只能在该方法中使用。调用System.out.println时遇到问题的原因是因为这是实际的可执行代码,要运行实际代码,它需要位于方法中。考虑查看本教程,了解它如何在java类中工作https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html