static 块仅在该类被加载时执行一次
classUseStatic{
staticinta=3;
staticintb;
staticvoidmeth(intx){
System.out.println("x="+x);
System.out.println("a="+a);
System.out.println("b="+b);
}
static{
System.out.println("Staticblockinitialized.");
b=a*4;
}
publicstaticvoidmain(Stringargs[]){
meth(42);
}
}
一旦UseStatic 类被装载,所有的static语句被运行。首先,a被设置为3,接着static 块执行(打印一条消息),最后,b被初始化为a*4 或12。然后调用main(),main() 调用meth() ,把值42传递给x。3个println ( ) 语句引用两个static变量a和b,以及局部变量x 。 注意:在一个static 方法中引用任何实例变量都是非法的。
下面是该程序的输出:
Static block initialized.
x = 42
a = 3
b = 12
2. Java的静态块和初始化块分别何时执行有什么区别
静态初始化块:当类第一次加载时执行。
非静态初始化块:非静态初始化块会在构造函数执行时,且在构造函数主体代码执行之前被执行。
区别如下:
1、执行次数不同
静态块只执行一次,初始化块可以执行多次。
2、作用不同
静态初始化块仅能初始化类变量,即static修饰的数据成员。
非静态初始化块可以初始化类的实例变量。
(2)java代码块执行顺序扩展阅读:
使用Java静态代码块注意事项:
1、它是随着类的加载而执行,只执行一次,并优先于主函数。具体说,静态代码块是由类调用的。类调用时,先执行静态代码块,然后才执行主函数的。
2、静态代码块其实就是给类初始化的,而构造代码块是给对象初始化的。
3、静态代码块中的变量是局部变量,与普通函数中的局部变量性质没有区别。
4、一个类中可以有多个静态代码块。
5、对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。
3. java,静态方法为什么不能调用类成员
楼主想问的应该是不用调用成员变量吧
首先,这涉及到代码执行优先级的问题,在一个Java类中,存在的代码形式有静态代码块(花括号{}包裹住的代码片段),静态方法,构造函数,成员方法。不同形式的代码执行顺序不同:
1、静态代码块:当类被载入时,静态代码块被执行,且只被执行一次,静态代码块常用来执行类属性的初始化。
2、静态方法(也叫类方法):在类加载的时候,在不创建对象的情况下执行,可以直接用类名调用。
两者的区别是静态代码块是主动执行的,静态方法是被动执行,只有被调用时才执行。
3、构造函数在创建对象的时候执行。
4、成员方法在被调用的时候执行。
总结:Java代码执行先后顺序:静态代码块>静态方法>构造函数=非静态代码块。
在了解执行顺序后,楼主的问题就很容易解答了。
从层级上看,静态方法属于类级别,成员变量属于对象级别。同时静态方法也先于构造函数执行,内存也没给类成员分配空间,说白就是都不存在,你静态方法调用一个不存在的变量肯定不行的呀。
4. Java类的实例化顺序是什么样的Java线程同步的方式有哪些
引言:java是在1990年初 ,被詹姆斯•高斯林等人开发的一门面向对象的编程语言。起初,java被称为0ak,来经过发展0ak改名为java,与1995年的五月份正式向大家发布。
java的实例化顺序在继承没有的情况
单独一个类的场景下,初始化顺序为依次为静态数据,继承的基类的构造函数,成员变量,被调用的构造函数。
其中静态数据只会初始化一次。(静态数据包括静态代码块和静态变量,每个类的静态数据只会初始化一次)
在继承的情况下
添加两个基类,让继承父亲,父亲继承祖父。
继承的情况就比较复杂了。由继承了基类,还将往上回溯,递归地调用基类的无参构造方法。
在我们的例子中,在初始化静态数据后,会先往上追溯,调用父的默认构造方法,此时再往上追溯到爷爷的默认构造方法。
无论是java还是什么别的东西他都体现了现代社会与信息技术的不断发展,人们在进行进行技术开发时也有了越来越多的方法。程序类的工作也有了更为快捷的方法,这为信息技术的发展也提供了更好的发展方法
5. java 调用静态方法和构造函数和静态块执行的先后顺序
java中首先是静态块先执行,静态方法,最后是构造函数。示例如下:
publicclassExA{
static{
System.out.println("父类--静态代码块");
}
publicExA(){
System.out.println("父类--构造函数");
}
{
System.out.println("父类--非静态代码块");
}
publicstaticvoidmain(String[]args){
newExB();
}
}
classExBextendsExA{
static{
System.out.println("子类--静态代码块");
}
{
System.out.println("子类--非静态代码块");
}
publicExB(){
System.out.println("子类--构造函数");
}
}
执行结果
=====
父类--静态代码块
子类--静态代码块
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数