java中Static内存图解

Static内存图解:

解析:

如代码:

①:当程序运行,class进行加载这时在方法区则会有class文件区

而class文件区内又有两个区(代码中有两个类一个person一个personDemo)这时class文件区的第一个区产生:

然后产生第二个区

class区域内有成员属性与成员方法.而为什么没有静态的属性与方法呢,是因为当程序加载该class文件时,系统会自动的把他所有静态的属性与方法分配到静态区 (方法区内有一个静态区);静态区内也有两块区域一个是personDemo类标记的main(String[]args)方法,一个是person标记的变量country=null(String类型初始默认值为null)

截止到现在他的初始化才完毕,则得出结论:静态的内容随着class的文件加载而加载

②:接着走的main方法进栈,main是静态修饰.静态可以通过类名调用,所以 根本不需要创建对象main方法就进栈内存,那么main方法一进栈系统则为它开辟空间;

开辟空间之后接着它创建了第一个对象Person p1 = new Person("邓丽君",16,"中国");

然后new Person在堆内存进堆之后系统会分配一个空间与内存地址假如是:0X0001,其实他也代表this,

同时这块内存区域内有name=null;age=0;与静态标记和方法标记:

静态标记是:静态区域有一个变量country他也有一个内存地址假如是0X01;这时他其实 是跟静态标记是有关联的,这个时候静态标记是指向静态区的country的

方法标记:系统在创建对象的时候,会自动生成一个方法区,这个方法区是属于当前对象的则Person,而这个方法区也有一个内存地址假如是:0X02;构造方法与show方法等带参不带参的方法都存储在方法区内它是由Person标记的内存地址是0X02;这是堆内存中的方法标记则与方法区产生关联,直到这时它所有的初始化才完成

③:当进行完以上步骤它的值又被改变了:Person p1 = new Person("邓丽君",16,"中国");这是给name; age;country进行赋第一个值:"邓丽君"通过走构造方法进内存,将"邓丽君给了"构造方法public Person(String name,int age,String country);中的neme;16给了age

这时找静态变量country"中国",但此时在堆内存中并没有这个静态变量.则找静态标记,0X01;通过内存地址0X01找到静态区 0X01标记的country,这时null则被"中国替代"

截止此时Person p1 = new Person("邓丽君",16,"中国")的值才会赋完.

④:运行到P1.show()方法,此时p1.show()方法调方法


public void show() {

System.out.println("姓名:"+name+",年龄:"+age+",国籍:"+country);
};

在方法区找有没有show方法.有show方法则show方法进栈为show方法开辟一个空间;那么show()方法在里面输出的时候首先找name,因为是p1调用,所以通过Person p1找name值在找age值在通过静态标记进入静态区找country值,所以第一次输出结果是:

当这些值在控制台显示之后.然后这个方法调用完毕就从内存中消失

接着运行:Person p2 = new Person("杨幂",22);步骤:Person p2则在栈内存开辟第二个空并给出内存地址:0X0002;

然后new Person()在堆内存开辟空间.然后:Person p2 = new Person("杨幂",22)将"杨幂",22赋值给name,age;此时并没有给country值,但是它 是有值的,因为他是静态值.它的静态标记0x01指向静态区域0x01;它的值还是以前的,但是由它们两个共享一个静态区域所以不需要再次进行赋值.然后找到p2.show()方法.使show()进栈,然后show()方法通过 Person p2-0x0002进堆内存通过name age找值,在通过静态标记找country的值.然后进行输出销毁内存,P3同理:

在当运行到p3.country = "美国";时,"美国"通过Person p3进堆,通过静态标记对country的值进行更改.因为所以方法共享一个静态区所以p3.show();
                p1.show();
p2.show();

                输出的country值都是美国

    

static关键字(理解)

(1)静态的意思:可以修饰成员变量和成员方法。
(2)静态的特点:
A:随着类的加载而加载
B:优先与对象存在
C:被类的所有对象共享
这其实也是我们判断该不该使用静态的依据。
举例:饮水机和水杯的问题思考
D:可以通过类名调用
既可以通过对象名调用,也可以通过类名调用,建议通过类名调用。
(3)静态的内存图
静态的内容在方法区的静态区
static关键字注意事项
A:在静态方法中是没有this关键字的
如何理解呢?
静态是随着类的加载而加载,this是随着对象的创建而存在。
静态比对象先存在。
B:静态方法只能访问静态的成员变量和静态的成员方法
静态方法:
成员变量:只能访问静态变量
成员方法:只能访问静态成员方法
非静态方法:
成员变量:可以是静态的,也可以是非静态的
成员方法:可是是静态的成员方法,也可以是非静态的成员方法。
简单记:
静态只能访问静态。
(5)静态变量和成员变量的区别
A:所属不同
静态变量:属于类,类变量
成员变量:属于对象,对象变量,实例变量
B:内存位置不同
静态变量:方法区的静态区
成员变量:堆内存
C:生命周期不同
静态变量:静态变量是随着类的加载而加载,随着类的消失而消失
成员变量:成员变量是随着对象的创建而存在,随着对象的消失而消失
D:调用不同
静态变量:可以通过对象名调用,也可以通过类名调用
成员变量:只能通过对象名调用
--------------------- 
原文:https://blog.csdn.net/yibin18566767255/article/details/79763791 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值