java中,静态字段和实例字段有什么区别?

有几个问题想问问大家
1、凡是声明在方法、构造方法、代码块外的变量或者常量都叫做字段,对吗?
2、静态字段和实例字段有什么区别?
3、实例变量也叫成员变量,静态变量也叫类变量,对吗?
4、实例变量在jvm运行时会被放在主存中,然后工作线程拷贝一份副本过去,对吗?
5、因为4,所以就会产生线程是否安全的问题,对吗?
6、是不是所有类的实例变量都会被放在主存中呢,如果对实例变量声明private,那么
能防止别的线程使用这个实例变量吗?还会产生线程安全吗?
7、单实例多线程并发访问,就像servlet的访问一样,多线程是不是都要等待这个实例被
其他线程使用完才能使用呢?

如果时间不足,可以随意提示一点tip给我,哪怕只是只言片语,先谢谢大家的不吝赐教!

java类的成员变量有俩种:一种是被static关键字修饰的变量,叫类变量或者静态变量;另一种没有static修饰,为实例变量。
在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
例如,对于下面的程序,无论创建多少个实例对象,永远都只分配了一个staticVar变量,并且每创建一个实例对象,这个staticVar 就会加1;但是,每创建一个实例对象,就会分配一个instanceVar,即可能分配多个instanceVar,并且每个instanceVar的值都只自加了1次。
public class VariantTest

{

public static int staticVar = 0;

public int instanceVar = 0;

public VariantTest()

{

staticVar++;

instanceVar++;

System.out.println(“staticVar = ”++staticVar “, instanceVar = ” ++instanceVar);

}

}
类的静态变量在内存中只有一个,java虚拟机在加载类的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享。静态变量可以直接通过类名进行访问,其生命周期取决于类的生命周期。
而实例变量取决于类的实例。每创建一个实例,java虚拟机就会为实例变量分配一次内存,实例变量位于堆区中,其生命周期取决于实例的生命周期。
public class Temp {

int t; //实例变量

public static void main(String args[]){

int t=1; //局部变量

System.out.println(t); //打印局部变量

Temp a= new Temp(); //创建实例

System.out.println(a.t); //通过实例访问实例变量

}

}
结果为:
1
0 (成员变量具有缺省值 而局部变量则没有)
把代码改为:
public class Temp {

static int t; //类变量

public static void main(String args[]){

System.out.println(t); //打印类变量

int t=1; //局部变量

System.out.println(t); //打印局部变量

Temp a= new Temp(); //创建实例

System.out.println(a.t); //通过实例访问实例变量

}

}
结果则为
0
1
0
希望能够给你带来帮助。

问大家
1、凡是声明在方法、构造方法、代码块外的变量或者常量都叫做字段,对吗?
2、静态字段和实例字段有什么区别?
3、实例变量也叫成员变量,静态变量也叫类变量,对吗?
4、实例变量在jvm运行时会被放在主存中,然后工作线程拷贝

①表示数据值。

⑤静态字段:类型状态的一部分

③实例字段:对象状态的一部分

静态字段在类开始加载时,会放在静态池中,后面再用时,会直接从静态池中取用,而不用重新创建。如果定义变量,则后面使用时会在栈中重新创建变量,然后初始化赋值或者引用对象的首地址。程序结束后,系统有垃圾回收机制会进行处理。相对而言,频繁创建变量执行效率会比较低一点。

常量:指出数据值恒定不变的符号。一般设计为静态的
字段:①表示数据值。

⑤静态字段:类型状态的一部分

③实例字段:对象状态的一部分

④建议将字段设计为私有,防止类型或对象的状态被类型外部的代码破坏
实例构造器:将实例字段初始化
类型构造器:将静态字段初始化

实例字段要实例化才能使用,没有实例化不能使用。静态字段反之
普通字段要在实例化时候才分配内存空间,而静态字段在装载程序集的时候就分配内存空间了

字段是什么?从学JAVA开始就没听说过叫字段的说法。。。。。
你要么叫变量,要么叫属性,我暂且理解你说的字段就是变量,静态变量和实例变量,

语法区别:静态变量需要static关键字修饰,实例变量不需要。

程序运行时的区别:静态变量从属于类,实例变量从属于对象。

  实例变量必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量;

  静态变量即类别量,只要程序加载了类的字节码,静态变量就会被分配空间,即可使用。

综上,实例变量必须创建对象后通过这个对象来使用,静态变量可以直接使用类名来引用

你先搞清楚实例变量的声明周期自然就知道了jvm的原理跟线程问题

多线程不需要等待实例用完,多线程跟实例用不用完没什么关系

new几个对象就会在内存中分配几个空间,堆和栈的关系你去搞清楚

量:指出数据值恒定不变的符号。一般设计为静态的
字段:①表示数据值。

⑤静态字段:类型状态的一部分

③实例字段:对象状态的一部分

④建议将字段设计为私有,防止类型或对象的状态被类型外部的代码破坏
实例构造器:将实例字段初始化
类型构造器:将静态字段初始化

常量:指出数据值恒定不变的符号。一般设计为静态的
字段:①表示数据值。

⑤静态字段:类型状态的一部分

③实例字段:对象状态的一部分

④建议将字段设计为私有,防止类型或对象的状态被类型外部的代码破坏
实例构造器:将实例字段初始化
类型构造器:将静态字段初始化

如其名,根据名字就可以区别了
实例字段要实例化才能使用,没有实例化不能使用。静态字段反之。如:
name字段的使用:
cla1 i = new cla1();
i.name = "张三";
sex字段的使用:
cla1.sex = "男";
区别二:
普通字段要在实例化时候才分配内存空间,而静态字段在装载程序集的时候就分配内存空间了。

我来回答一下第四个问题

在深入理解JAVA虚拟机这本书中提到过,
Java内存模型规定了所有的变量都必须存储在主内存中,
这里说的变量包括了实例字段、静态字段和构成数组元素的对象。

每个线程都有自己的工作内存,
工作内存想要对变量进行操作,
必须先将主内存中的变量拷贝至工作内存,
然后再进行操作。