何时初始化静态字段?如果我从不实例化一个类,但是我访问一个静态字段,是否所有静态块和私有静态方法用于实例化那个时刻调用的私有静态字段(按顺序)?
如果我调用静态方法怎么办?它是否也运行所有静态块?方法之前?
以下代码打印null一次.
class MyClass {
private static MyClass myClass = new MyClass();
private static final Object obj = new Object();
public MyClass() {
System.out.println(obj);
}
public static void main(String[] args) {}
}
Run Code Online (Sandbox Code Playgroud)
为什么在构造函数运行之前没有初始化静态对象?
更新
我只是在没有注意的情况下复制了这个示例程序,我以为我们正在谈论2个Object字段,现在我看到第一个是MyClass字段..:/
我正在使用Spring MVC.我有一个UserService带有@Service很多静态变量的类注释.我想用application.properties文件中的值来实例化它们.
例如,在application.properties中我有: SVN_URL = http://some.url/repositories
然后在课堂上有: @Value("${SVN_URL}") private static String SVN_URL
我明白了 Instantiation of bean failed; nested exception is java.lang.ExceptionInInitializerError
我也试过了 @Autowired private static Environment env;
然后: private static String SVN_URL=env.getProperty("SVN_URL");
它给出了同样的错误.
它表示非静态变量不能用于静态方法.但是public static void main.如何?
来自在C世界中受过训练的程序员,这是我对OCaml的主要方法.
let main () =
Printf.printf "Hello, world - %d %s\n" (Array.length Sys.argv) Sys.argv.(0)
;;
main ()
Run Code Online (Sandbox Code Playgroud)
但是,这段代码适用于ocaml/ocamlc/ocmalopt.
Printf.printf "Hello, world - %d %s\n" (Array.length Sys.argv) Sys.argv.(0)
;;
Run Code Online (Sandbox Code Playgroud)
这背后的逻辑是什么?OCaml是否类似于脚本语言(即使它用ocamlc或ocamlopt编译成二进制),因为它不需要main函数?
与Scala相比,我们可以从App扩展,以便不定义main方法.
object Hello extends App {
class A
println(new A() getClass())
print("Hello, world")
}
Run Code Online (Sandbox Code Playgroud)
即使在这种情况下,我们也需要 Hello.main(args)在解释器模式下执行它:即,scala hello.scala.OCaml似乎不需要对ocaml(解释),ocamlc和ocamlopt(编译)进行任何更改.
那么,我们是否需要OCaml中的主要功能?如果是这样,OCaml是否只是从代码的开头到结束生成代码?如果是这样,OCaml如何找到具有多个源代码的主代码?