深入分析Java中的关键字static

摘自:https://baijiahao.baidu.com/s?id=1636927461989417537&wfr=spider&for=pc

static 代表是静态的

修饰类内的类、方法、成员变量

修饰的类中类,可以用类名直接调用如:StaticTest.InnerClass()

其他的方法只能通过实例化的对象调用,如:

  StaticTest   obj =  new  StaticTest();

  obj.InnerMethod()

修饰的方法如主函数main

修饰的成员变量,这个变量就属于类了,不属于变量,即使实例化了对象obj1,只要给赋值,

那其他实例化的对象的这个变量的值也会改变,对象obj2.变量再给赋值,obj1.变量也会改变。

这个变量相当于全局的变量。

  StaticTest   obj1 =  new  StaticTest();

  obj1.变量=1

  StaticTest   obj2 =  new  StaticTest();

  obj2.变量也就成了1,如果obj2.变量再给赋值,

  如obj2.变量=2,obj1.变量也就成了2

 

 内部的原理:

 

 

从上图我们可以发现,静态变量存放在方法区中,并且是被所有线程所共享的。这里要说一下java堆,java堆存放的就是我们创建的一个个实例变量。

堆区:

1、存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)

2、jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身

栈区:

1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中

2、每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。

3、栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。、

方法区:

1、又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。

2、方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。

下面通过一个案例说明一下,从内存的角度来看,static关键字为什么会有这样的特性。

 

 

下面对static关键字进行一个小结:

(1)特点:

  1、static是一个修饰符,用于修饰成员。(成员变量,成员函数)static修饰的成员变量 称之为静态变量或类变量。

  2、static修饰的成员被所有的对象共享。

  3、static优先于对象存在,因为static的成员随着类的加载就已经存在。

  4、static修饰的成员多了一种调用方式,可以直接被类名所调用,(类名.静态成员)。

  5、static修饰的数据是共享数据,对象中的存储的是特有的数据。

(2)成员变量和静态变量的区别:

  1、生命周期的不同:

    成员变量随着对象的创建而存在随着对象的回收而释放。

    静态变量随着类的加载而存在随着类的消失而消失。

  2、调用方式不同:

    成员变量只能被对象调用。

    静态变量可以被对象调用,也可以用类名调用。(推荐用类名调用)

  3、别名不同:

    成员变量也称为实例变量。

    静态变量称为类变量。

   4、数据存储位置不同:

    成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据。

    静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。

  (3)静态使用时需要注意的事项:

    1、静态方法只能访问静态成员。(非静态既可以访问静态,又可以访问非静态)

    2、静态方法中不可以使用this或者super关键字。

    3、主函数是静态的

posted @ 2020-07-18 12:50  胜难  阅读(162)  评论(0)    收藏  举报