java中的代码块是什么意思,怎么用
代码块是一种常见的代码形式。他用大括号“{}”将多行代码封装在一起,形成一个独立的代码区,这就构成了代码块。代码块的格式如下:
1.普通代码块:是最常见的代码块,在方法里用一对“{}”括起来的数据,就是普通的代码块,
2.构造代码块:是在类中直接定义的,用“{}”括起来的代码。每次调用构造方法前执行,都会先执行构造代码块。
3.静态代码块:他在类中的成员位置,用“{}”括起来的代码。只不过他用了static修饰了,,且执行一次
4.代码块面试测试题:结合了,普通代码块,构造代码块,静态代码块,是大家能够够清楚的明白代码块执行的数序以及规律
5.代码块面试测试题:结合了,普通代码块,构造代码块,静态代码块,是大家能够够清楚的明白代码块执行的数序以及规律,——————面试题结果
6.他会先执行class 文件class Nihaoa到内存。所以他会执行class Nihaoa类下的静态块,在执行main方法,编译class GouZao类,然后执行代码,静态的执行一次,构造方法块每次执行
java中非静态方法能调用静态方法吗
首先直接回答你,在java非静态方法可以调用静态方法。
这个结论可以引伸为在非静态方法中能访问静态方法、静态成员变量和非静态成员,而在静态方法中只能访问静态成员,即静态方法和静态成员变量。
在java的基本概念中,类和对象是两个截然不同又相互关联的概念,类相当于模板,是抽象的,对象相当于实例,是具体的,所以两者的联系就是类实例化之后成为对象。静态成员本身是归属于类的,也称类成员,而实例成员归属于对象。在java的机制中,当类被加载的时候,实际上加载的是它的模板,就是这个类文件,这个时候只有它的静态成员。而只有通过new关键字或反射方法调用了类的构造方法之后,才会生成类的实例对象,这个时候内存里才有了实例成员。
综上,在内存里总是先有静态成员,然后才有实例成员,所以在实例方法里调用静态方法才有可能,反之上哪调用去?而且,实例方法归属于对象,想在静态方法里调用的话也得先把对象实例化了才能调用呀,直接调用是取无根之水,不行吧。唠叨这么多,希望对你有所帮助,助你知其然且知其所以然!
java非静态方法可以调用静态变量吗
当然可以。
1. 静态成员变量和静态成员方法都是属于类而不是某一个具体实例的,静态成员(包括属性和方法)是在类加载阶段就已经初始化了的,所以当某一个实例访问静态成员的时候,静态成员肯定是已经存在了的,所以可以访问。
2.反过来,如果让静态方法去访问实例成员那就不行了,因为实例成员的初始化在静态成员之后
static和Volatile的区别
变量放在主存区上,使用该变量的每个线程,都将从主存区拷贝一份到自己的工作区上进行操作。
volatile, 声明这个字段易变(可能被多个线程使用),Java内存模型负责各个线程的工作区与主存区的该字段的值保持同步,即一致性。
static, 声明这个字段是静态的(可能被多个实例共享),在主存区上该类的所有实例的该字段为同一个变量,即唯一性。
volatile, 声明变量值的一致性;static,声明变量的唯一性。
此外,volatile同步机制不同于synchronized, 前者是内存同步,后者不仅包含内存同步(一致性),且保证线程互斥(互斥性)。
static 只是声明变量在主存上的唯一性,不能保证工作区与主存区变量值的一致性;除非变量的值是不可变的,即再加上final的修饰符,否则static声明的变量,不是线程安全的。
下面摘自Java语言规范(Java Language Specification)的官方解释:
1) If a field is declared static, there exists exactly one incarnation of the field, no matter how many instances (possibly zero) of the class may eventually be created.
2) A field may be declared volatile, in which case the Java Memory Model ensures that all threads see a consistent value for the variable。