关于#java#的问题:Java中静态变量和实例变量的区别是什么
静态变量使用static关键字修复,可以通过类来调用,所有类的对象共享一份数据;实例变量通过类对象来调用,每一个对象都有一份自己的数据
Java语言规范和Java虚拟机规范是Java的重要文档,可惜的是他们都没有说明Java线程的调度问题。或许从Java的角度看,线程并不是Java最基本的内容。毕竟Thread类也仅仅是Java一个特定的类而已。
终于在Java SE 8 API规范的Thread类说明中算是找到了线程调度的有关描述:
我们是通过Java创建的线程,线程调度的事儿Java是脱不开的。那Java又是如何将线程调度交给底层的操作系统去做呢?下面我们将跟随JVM虚拟机底层平台上的实现,说明Java线程的调度策略。
既然Java底层的运行平台提供了强大的线程管理能力,Java就没有理由再自己进行线程的管理和调度了。于是JVM放弃了绿色线程的实现机制,将每个Java线程一对一映射到底层平台上的一个本地线程上,并将线程调度交由本地线程的调度程序。由于Java线程是与本地线程是一对一地绑在一起的,所以改变Java线程的优先权也不会有可靠地运行结果。
静态变量和实例变量在Java中的不同点有:
存储位置不同:静态变量存在于静态存储区中,实例变量存在于堆内存中。
生命周期不同:静态变量生命周期与类相同,实例变量随着对象的创建而创建,与对象的生命周期相同。
访问方式不同:静态变量通过类名.变量名的方式访问,实例变量通过对象名.变量名的方式访问。
初始化时机不同:静态变量在类加载时初始化,实例变量在对象创建时初始化。
静态变量可以直接使用,而实例变量需要先创建对象,然后通过对象来访问。
下面是一个演示静态变量和实例变量的示例代码:
public class Test {
static int i = 0; //静态变量
int j = 0; //实例变量
public static void main(String[] args) {
Test t1 = new Test();
t1.i++;
t1.j++;
System.out.println("t1: i=" + t1.i + ", j=" + t1.j); //输出结果:t1: i=1, j=1
Test t2 = new Test();
t2.i++;
t2.j++;
System.out.println("t2: i=" + t2.i + ", j=" + t2.j); //输出结果:t2: i=2, j=1
}
}
在上面的代码中,i是一个静态变量,j是一个实例变量。t1和t2都是Test类的对象,创建两个对象分别对i和j进行自增操作,观察输出结果可以看到,t1和t2对静态变量的操作是同步的,都会对i进行自增操作,但是对于实例变量j,t1和t2操作是互不影响的。