以下内容无法编译,给出"非法转发引用"消息:
class StaticInitialisation {
static
{
System.out.println("Test string is: " + testString);
}
private static String testString;
public static void main(String args[]) {
new StaticInitialisation();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,以下编译:
class InstanceInitialisation1 {
{
System.out.println("Test string is: " + this.testString);
}
private String testString;
public static void main(String args[]) {
new InstanceInitialisation1();
}
}
Run Code Online (Sandbox Code Playgroud)
但以下内容无法编译,给出"非法转发引用"消息:
class InstanceInitialisation2 {
private String testString1;
{
testString1 = testString2;
}
private String testString2;
public static void main(String args[]) {
new InstanceInitialisation2();
}
}
Run Code Online (Sandbox Code Playgroud)
为什么StaticInitialisation和InstanceInitialisation2不能编译,而InstanceInitialisation1呢?
这是如何编译而没有错误的?根据我的理解,编译器检查变量的类型(在这种情况下String),然后查看右侧表达式的类型是否对应于变量的类型(或者至少是一个子类型,但让我们坚持使用String上课,因为它是最后的).
public class InitClass {
public static void main(String[] args) {
String str = (str = "hello");
System.out.println(str);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是如何str = "hello"编译?编译器是否已经知道str应该是类型String?