静态(static)变量、方法的本质

首先明确static修饰的是跟着走,而不是跟着对象走。

							类的形象解释
	○ 把类看成是一个房子,房子里面有家具,桌椅板凳之类的,房子里面还有人。
	○ 这些家具是唯一的(那么就是静态的,为静态变量),所有类的变量都共用这一套家具。
	○ 房子里面的人(就相当于非静态变量),因为每套房子里面的人都可能不一样。

							类的Java解释

	Ø 静态变量也叫做类变量,它开始于类的创建,结束于类的消亡。(所有new的类,都共用这一套静态变量,座椅板凳是类变量,它们是在房子被建好了之后就被添加放置进来,而且基本都是唯一的。) 
	
	Ø 非静态变量叫做实例变量,它开始于类的实例的创建,结束语类的实例的消亡。(所有new的类,实例变量都可能不一样,房子里面的人,可以是张三,也可以是李四,或者王二麻子。这些人在类未被创建时,还是一个抽象的实例对象,当类被创建之后,就可以指定具体的人,此时就成为了实例变量。)

					      类的内存解释
	§ 当一个类被创建并初始化后,内存中会有两个区域,栈区和堆区。
	
	§ 栈中主要存放的是引用变量,堆中主要存放的是真实的被实例化后的类。
	
	§ 栈中的引用变量会指向堆中的真实对象地址。比如A a=new A(); a这个变量就会在栈中,实际被new出来的类A的对象会放在堆中,a指向实际被new出来的A对象。
	
	§ 如果一个类中有静态变量的话,程序首先会把该静态变量加载进内存中,也就是在堆中开辟一个区域专门存放。
	
	§ 以后不管你new多少个类的对象,该静态变量永远都是在那里的。也就是说,静态变量在类的初始化一次后,系统就不会为该变量开辟新的内存空间。而每new一个类的对象,系统就会重新在堆内存中开辟一个新空间来存放该类的实例对象,并且栈中也会有一个新的引用变量去指向它。 (即静态变量在堆中存在且为唯一,在内存种有唯一的地址; 而每new一个类的对象,都会在队中新建一个实例对象,在内存种开辟一块新的地址)

  • 静态方法也是类似的流程也是类似

  • 但是有一点要强调,静态方法只中不能调用非静态方法。

  • 因为被static修饰的方法会首先被Classloader对象先加载进内存,而这个时候可能其它的非静态方法或者变量还没有被加载进来。

  • 就好比我现在想做包子,现在面粉被static修饰,首先已经拿到你身边,可是因为包子馅不是static修饰的,所以可能包子馅儿还没运过来,你说怎么做的出包子呢。

  • 被static修饰过的都是随着类的初始化后就产生了,在堆内存中都有一块专门的区域来存放,所以只需要类名点方法名或者变量名即可。

  • 而非静态的就必须通过类的对象去调相应的。(此时并未在内存种创建,因为他还只是一个抽象的实例对象【在内存中并不存在】,只有创建该类后,才能拿到【此时就是实例变量,在内存中是切实存在的】)就像是你想要红色的衣服,你必须是从穿红色的衣服的人的身上拿过来才行,所以你必须找到穿红色衣服的人,也就是类的实例对象,而你如果要去找一个桌子,而桌子就在房间里摆着,你只要进到房间里直接走过去拿来就可以了~~

在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值