java中有关static静态变量

23 阅读3分钟

static作用

image.png

加上static之后代表所有对象都共享了一个老师的名称

image.png

此时第二个学生对象也有了老师的名称,第二个对象就不必在调用对象了,第一个还需要 不过如果在前面用student(类名来调用对象)就可以不用,单独的用一个对象来调用了

image.png 下面的对象不用调用javabean,就能有这个老师的名称

static的特点

image.png

static中对象的内存分析

image.png 首先main方法先进栈,因为用到了Student这个类,所以

image.png

此时会创造一个单独存放静态变量的静态存储位置叫静态区 静态变量是随着类的加载而加载的,优先于对象出现的

image.png 执行完第一行代码时此时静态变量中的情况

image.png 第二行代码的执行情况 左边的代码在栈内存中存放,右边的代码因为有new在堆内存中开辟了一个空间,地址值,所有的非静态变量有存放在这个地址值中,并且是默认赋值 再把那个小空间的地址赋值给s1

image.png 第三行第四行代码分别是赋值name和age,将new开辟出来的那个小空间里的值更改

image.png S1调用了show方法,之后就要出栈

image.png 执行到s2这个代码,因为有new所以又在堆内存开辟一个小空间,将小空间的地址值放到赋值给s2,在之后s2调用show()方法,打印出的是null,0(这些是初始值)和阿伟老师

static修饰方法的特点

image.png

工具类

image.png

image.png 私有化构造方法,因为调用这里面的对象没有什么意义

static注意事项

image.png

小案例

image.png

正常方法中的this用法

image.png this表示当前方法调用者的地址值,就是右边的s1和s2的地址值 在public void show1(Student this)中这个this是虚拟机赋值的,就是在右边不用写this

image.png 右边调用的时候,其实实际应该是上面这样的写法,this表示右边的地址值,调用的就是s1的name和age

这个this就是右边对象的地址值

static中是没有静态关键字的

image.png 整体的代码在上一个 在静态的方法里面this都是用不了的 那两行注释的代码都是报错的

内存角度讲解static的静态方法

image.png 首先是main方法进栈,调用student对象,堆内存方法区再加载student的字节码文件,堆内存中再加上一个静态储存位置,static的阿伟老师 再执行第二行语句,method

image.png method是静态方法,t他能调用的只有静态变量teachername,而name无法调用最后的结果是null

image.png 非静态的成员变量又叫做实例变量 实例变量的调用需要用到对象,而现在堆内存里还没有变量的产生 在静态方法中也不能调用非静态成员的变量,因为就没有对象所以无法调用

内存角度讲解非静态

image.png

有对象所以在堆内存中开辟了一个地址值,上图是第一句话的作用

区别总结

静态对象是优于对象而存在的 非静态变量可以访问

image.png

重新认识main方法

image.png Main()方法中的数组是用来接收键盘输入数组的,在右上角有个模式输入