在我写system.out.println()的情况下找不到包系统;
它是带大写S的System
代码语言:javascript复制class Demo {
public static void main (String[] args) {
System.out.println ("Hello");
}
}编译器假定它是包名而不是类名或变量名的原因在于JLS的6.5部分,"Determining the meaning of a name"
名称的含义取决于它所在的上下文。确定名称的含义需要三个步骤。
首先,上下文导致名称从语法上归入以下六种类别之一: PackageName、TypeName、ExpressionName、MethodName、PackageOrTypeName或AmbiguousName。
其次,最初按上下文分类为AmbiguousName或PackageOrTypeName的名称随后被重新分类为PackageName、TypeName或ExpressionName。
第三,最终得到的类别指示最终确定名称的含义(如果名称没有含义,则会出现编译错误)。
由于6.5.1的原因,您的特定用途是AmbiguousName
在以下上下文中,名称在语法上被归类为MethodName:(1)在方法调用表达式中的'(‘之前;(2) 一些其他不相关的上下文。
在以下上下文中,名称在语法上被分类为AmbiguousName:(1)在“‘”的左侧在限定的ExpressionName中;(2)在‘’的左边在限定的MethodName中;(3) 一些其他不相关的上下文。
根据您的代码,system.out.println(whatever)是一个前面带有AmbiguousName的限定MethodName。在这个过程的后面,前面提到的6.5.2,重分类发生了:
如果AmbiguousName是限定名称,由名称、“.”和“标识符”组成,则“.”左边的名称首先被重新分类,因为它本身就是一个AmbiguousName。
如果“.”左边的名称被重新分类为PackageName,则如果有一个包的名称是“”左边的名称。并且该包包含名称与标识符相同的类型的声明,则此AmbiguousName将被重新分类为TypeName。
否则,此AmbiguousName将被重新分类为PackageName。
稍后的步骤确定该名称的包是否实际存在。
因为遍历树的重分类(从println到system)永远不会产生TypeName,所以总是默认重分类到PackageName。
这就是为什么您看到的错误消息是关于缺少包而不是缺少类的原因。