类初始化,也就是静态初始化。
类加载的时候执行
如果不要static就是对象初始化了
类加载的时候执行
如果不要static就是对象初始化了
解决方案 »
- import导入整个包和包中的一个类,有什么区别吗?
- java代码有没有办法操作封包?
- 急死了!
- 求解输出一个字符串数组的所有组合的问题?
- 怎么样在 .NET 下做一个程序,让这个程序做这样的一件事: 24小时检测公司的防火墙是不是死掉,如果死掉就调用 DEPLHI平台下编译的短信平
- 关于垃圾回收
- 100分 请教file类问题
- 如何在文件中随机选取一行输入到另一个文件中?
- 这个程序的String[] a为什么有错?
- I have a question here, give 100marks if you can give me the code in 2 hours, wait online
- 请大家提点关于用JAVA做毕设的好建议!
- 有关异常的问题
static {
registerNatives();
}
这有什么意义呢,registerNatives();这个方法里面没有任何的动作呀
}
是静态类的构造函数
请高手解疑,谢谢答:你上面那个类是去实现一个Serializable的接口,我看了那个接口,没有一个方法。
然后你定义一个方法registerNatives,后面你去调用这个方法。流程就这样。
static{}这个是一个静态块,是不需要名字的,里面的方法是全部都是静态的。
这个东西通常用于做什么,就是说什么情况下,这样的写法常用?
xq_zz() ( )
tom2005(快乐着)
static{}这里的程序什么时间执行?什么情况下会执行?需要什么显式的调用吗?
这个东西通常用于做什么,就是说什么情况下,这样的写法常用?
有static attribute,
static method,
static block.其实java中attribute、method、block这三种形式本来就有.你上面的程序就是block的static 用法.你感到诧异,
可能你没注意过java中的block.
你看下面的代码就知道了.
public class JBlock
{
private int i=1;
private int j=2;
private static int k=3;
private static int l;
//这是一个block
{
System.out.println("Here is block!");
l=5; //it can set value!
i=0;
System.out.println(k+l);
}
//这是一个static block
static
{
System.out.println("Here is static block!");
System.out.println(k+l);
print();
//main(); error!可见即使在static block中也不可以调用main()方法
}
// Constructor
public JBlock()
{
System.out.println("Here is Constructor!");
}
//static main() 方法
public static void main(String [] args)
{
System.out.println("Here is main!");
JBlock block = new JBlock();
}
//static method
public static void print()
{
System.out.println("Here is static function codes!");
}
}
其执行效果为:
Here is static block!
3
Here is static function codes!
Here is main!
Here is block!
8
Here is Constructor!由此可见,它们的执行顺序为:
static block > static function > static main() > block > constructor.
而且仅管static block在static main()之前执行,你也不可以调用main()方法.
你可能感到奇怪,为何block会在constructor 之前呢,
这我也不知道,你问java的高手或问编jvm的人吧!你别认为我把static block写在static main()之前所以才先调用,其实不是这样的,
你就是把static block和static function写在static main()之后,
它还是这样的执行顺序!static 是属于类的,只有jvm把它加载进来时,它才被执行,且只被执行一次!有些static的注意点,楼上的兄弟也讲了,
我就不再多说了!
我刚才说错了,
应该是static main()最先执行,
因为它是程序的入口,
不过"here is main!"为何显示在中间呢?
应该是main()执行时,
它什么事都不干,
除非等到把static block和static function执行完后再执行main()中的代码!
我犯了这个错误,
真的不好意思,
让大家耻笑了!
当然你也可以自己显式调用它们,但有一个例外,即static main()可不是让你随便调用的!static attribute一般是类的属性,如Student类它可以有static int studentTotalNum属性.
这个属性不依对象而存在,你即使没new出一个对象实例,它也是存在的.值为0.
而且根据OOP的思想,你不把它定义为类属性也不可能.任何一个student对象没有义务要有studentTotalNum.这是属于Student类的.
定义成static还有个好处,可以节省内存空间!所有的student对象共享这个变量值!
其实说白了,它的目的就是在类中变量共享!static method主要就是操作static attribute的!
还有,你不能在static method中操作实例变量!
我刚才说错了,
应该是static main()最先执行,
因为它是程序的入口,
不过"here is main!"为何显示在中间呢?
应该是main()执行时,
它什么事都不干,
除非等到把static block和static function执行完后再执行main()中的代码!
我犯了这个错误,
真的不好意思,
让大家耻笑了!
======================================
main不是先运行的
jvm先载入要运行的类,初始化static变量和执行static块
然后在类中寻找main方法,没找到的话就会出现一个很常见的异常
找到的话,则执行main
registerNatives();
}
这个方法是类的初始化,就是第一次创建这个类时, static {}里的方法都只执行一次,包括里面定义的变量等,在第二次创建这个类时。就不在执行static {}里的方法~!