我的问题是静态关键字的一个特定用法.可以使用static关键字来覆盖不属于任何函数的类中的代码块.例如,以下代码编译:
public class Test {
private static final int a;
static {
a = 5;
doSomething(a);
}
private static int doSomething(int x) {
return (x+5);
}
}
Run Code Online (Sandbox Code Playgroud)
如果你删除static它抱怨的关键字,因为变量a是final.但是,可以删除两个final和static关键字并使其编译.
这两种方式让我感到困惑.我怎么能有一个不属于任何方法的代码部分?如何调用它?一般来说,这种用法的目的是什么?或者更好,我在哪里可以找到关于此的文档?
我的问题很简单.我正在尝试创建一组java.net.URLs public static final,以便任何类都可以从任何上下文访问它们,因为这些URL在运行时不会更改.但是,当我尝试创建它们时,我收到编译器错误,告诉我必须捕获或声明抛出a java.net.MalformedURLException,但这在方法之外是不可能的.有没有办法绕过这样一个抛出非java.langThrowable的构造函数?
下面的一些虚拟代码可视化我的问题:
public class Main
{
public static final java.net.URL STATIC_URL = new java.net.URL("http://example.com/");
public static void main(String[] args)
{
GUI gui = new GUI();
gui.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
public class GUI extends java.awt.Window
{
public GUI()
{
add(new java.awt.Label(Main.STATIC_URL.toString()));
}
}
Run Code Online (Sandbox Code Playgroud)
如果你试图编译它,它会告诉你,你不能因为第3行.因此我的问题.
有人可以解释一下以下是什么吗?
public class Stuff
{
static
{
try
{
Class.forName("com.mysql.jdbc.Driver");
}
catch ( ClassNotFoundException exception )
{
log.error( "ClassNotFoundException " + exception.getMessage( ) );
}
...
}
Run Code Online (Sandbox Code Playgroud)
这静态{...}做了什么?
我知道来自C++的静态变量,但这是一个静态块还是什么?
什么时候这个东西会被执行?