Java中为何能在方法定义前调用?与JavaScript函数提升有何不同?
Java中先调用后定义方法的原因解析
这和JavaScript的函数提升完全不是一回事,Java的底层逻辑是另一种机制:
Java编译器的类全量扫描机制:Java在编译类的时候,会先完整扫描整个类的所有成员(包括方法、字段)的声明信息,不管你写代码时的顺序如何,编译器都能提前知道这个类里存在哪些方法。
比如你给出的代码里,编译器会先识别到Sample_class类里有sample_meth1和sample_meth2两个方法,等编译sample_meth1内部的调用代码时,已经确认sample_meth2是本类的合法成员方法,自然不会报错。成员方法的可见性规则:只要是同一个类的成员方法,不管定义顺序先后,彼此之间都是可见的。哪怕你在
main方法里调用类中后面定义的成员方法,原理也是一样——编译器提前扫完了整个类的成员信息,知道这个方法存在。
你之前以为会出现编译错误,是把JavaScript的函数提升逻辑套到了Java上,但两者的编译模型完全不同:JS是基于作用域的预解析,而Java是类级别的全量成员扫描,这才是Java能支持这种写法的核心原因。
内容的提问来源于stack exchange,提问作者Rudra Shivgan
相关产品推荐
相关产品推荐

