1. java 中静态代码和非静态代码块的区别!
相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,
一般在代码块中对一些static变量进行赋值。
不同点:静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。
静态代码块只在第一次new执行一次,之后不再执行,而非静态代码块在每new
一次就执行一次。非静态代码块可在普通方法中定义(不过作用不大);而静态代码块不行。
例:
//普通类
public class PuTong {
public PuTong(){
System.out.print("默认构造方法!-->");
}
//非静态代码块
{
System.out.print("非静态代码块!-->");
}
//静态代码块
static{
System.out.print("静态代码块!-->");
}
public static void test(){
{
System.out.println("普通方法中的代码块!");
}
}
}
//测试类
public class TestClass {
/**
* 区别两次new静态与非静态代码块执行情况
*/
public static void main(String[] args) {
PuTong c1 = new PuTong();
c1.test();
PuTong c2 = new PuTong();
c2.test();
}
}
/*
运行输出结果是:
静态代码块!-->非静态代码块!-->默认构造方法!-->普通方法中的代码块!
非静态代码块!-->默认构造方法!-->普通方法中的代码块!
*/
2. java 中静态代码和非静态代码块的区别
区别很简单:
静态代码块,在虚拟机加载类的时候就会加载执行,而且只执行一次;
非静态代码块,在创建对象的时候(即new一个对象的时候)执行,每次创建对象都会执行一次
3. 在java中,什么叫静态,什么叫非静态
由static
关键修饰的内容
为静态
;
反之
,为非静态
静态变量
属于
类
,为所有对象共有
分静态变量
属于
对象
,
每个对象都可以有且属性值可以各异
静态变量优于非静态变量加载,故
静态代码块中不能引用非静态成员,会报错
4. 浅谈JAVA中静态初始化块和非静态初始化块的区别
非静态初始化块,是指构造方法吧
静态的访问不了成员变量,除了工厂模式,其他用的很少
5. java中为什么非静态块在构造方法之前执行
JVM虚拟机类的加载顺序就是如此
虚拟机在首次加载Java类时,会对静态初始化块、静态成员变量、静态方法进行一次初始化
6. Java的静态块和初始化块分别何时执行有什么区别
静态初始化块:当类第一次加载时执行。
非静态初始化块:非静态初始化块会在构造函数执行时,且在构造函数主体代码执行之前被执行。
区别如下:
1、执行次数不同
静态块只执行一次,初始化块可以执行多次。
2、作用不同
静态初始化块仅能初始化类变量,即static修饰的数据成员。
非静态初始化块可以初始化类的实例变量。
(6)java非静态块扩展阅读:
使用Java静态代码块注意事项:
1、它是随着类的加载而执行,只执行一次,并优先于主函数。具体说,静态代码块是由类调用的。类调用时,先执行静态代码块,然后才执行主函数的。
2、静态代码块其实就是给类初始化的,而构造代码块是给对象初始化的。
3、静态代码块中的变量是局部变量,与普通函数中的局部变量性质没有区别。
4、一个类中可以有多个静态代码块。
5、对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。
7. java 静态类和非静态类的区别
静态类和非静态类的主要区别:
主要区别在于静态类不能实例化,静态类编译器能够执行检查确保不是偶然的添加实例成员,C#编译器会自动把它标记为sealed,静态类中不能创建非静态的方法,即静态方法中只能创建静态方法,但在非静态类中可以调用静态方法。
静态类的主要特性:
1:仅包含静态成员。
2:无法实例化。
3:是密封的。
4:不能包含实例构造函数。
5:非静态类可以包含静态的方法、字段、属性或事件;
6:静态方法和属性不能访问其包含类型中的非静态字段和事件
7:静态方法只能被重载,而不能被重写,因为静态方法不属于类的实例成员;
8:C# 不支持静态局部变量(在方法内部定义静态变量)。
非静态类在使用时必须要实例化,每次使用时都要进行实例化,一般情况下使用比较频繁的类,可以使用静态类,比如LogClass,ConfigClass等等。
8. JAVA 静态代码块和非静态代码块 作用
静态代码块是在类加载进jvm时类实例化之前运行的,比如业务场景有这种类初始化时需要加载许多资源,在运行实例化类的时候会影响程序响应时间,所以就在项目启动的时候加载类的时候就初始化了.非静态代码块是在类实例化的时候才会运行,所以静态代码块的执行一定在非静态代码块执行之前执行.至于你上面的第一个问题要看具体业务场景和需求,赋值都可以实现.第二个问题,可能是写那句代码的人要看程序加载后有没有执行那部分代码而加上的,知道了静态代码块和非静态代码块的本质区别,为什么那么做和目的你就应该知道了.
9. Java中非静态方法是否共用同一块内存
答案是不会,我们用field表示字段,用method表示方法,那么加上static区分后就 有四种:
class field:有用static修饰的field
class method:有用static修饰的method
instance field:没有用static修饰的field
instance method:没有用static修饰的method
那么他们在内存中的表示为:
class field:共用一块记忆体
class method:共用一块记忆体
instance field:随着每个instance各有一块记忆体
instance method:共用一块记忆体
如果instance method也随着instance增加而增加的话,那内存消耗也太大了,为了做到共用一小段内存,Java是根据this关键字做到的,比如:instance1.instanceMethod(); instance2.instanceMethod(); 在传递给对象参数的时候,Java编译器自动先加上了一个this参数,它表示传递的是这个对象引用,虽然他们两个对象共用一个方法,但是他们的方法中所产生的数据是私有的,这是因为参数被传进来变成call stack内的entry,而各个对象都有不同call
stack,所以不会混淆。其实调用每个非static方法时,Java编译器都会自动的先加上当前调用此方法对象的参数,有时候在一个方法调用另一个方法,这时可以不用在前面加上this的,因为要传递的对象参数就是当前执行这个方法的对象。
为什么静态方法中不能调用非静态方法?这是因为静态方法直接跟class相关,调用此方法的时候是类直接调用的,而不是对象,所以Java编译器就没有对象参数可以传递,这样,如果你在静态方法内部调用非静态方法,那么Java编译器怎么判断这个非静态方法是哪个对象调用的?对吧,所以Java编译器就会报错,但是也不是绝对的,Java编译器是隐式的传递对象参数,那么我们总可以显示的传递对象参数吧,如果我们把某个对象的引用传递到static方法里,然后通过这个引用就可以调用非静态方法和访问非静态数据成员了。
也是一样的,方法都属于类数据,类数据都放在方法区中,《深入java虚拟机》有一个虚拟机的体系结构,在那里你可以看到线程都放在java栈里,栈帧代表一个方法的返回状态,执行完一个方法就会弹出这个栈帧,方法区和堆中的数据时所有线程都共享的,所以这里没有线程的区分。
10. java非静态代码块和构造代码块是同一种吗
构造块:直接在类中定义且没有加static关键字的代码块称为{}构造代码块。构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。
普通代码块:在方法或语句中出现的{}就称为普通代码块。普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”