回顾static

static:
	意为:静态的
关于类:
	类 = 属性 + 方法;一个java软件它是由很多类组成的,一个类中有两部分,属性和方法。
	属性:定义在类体中,方法外的变量或者是数据。在java中没有什么变量和方法是定义在类外面的。
		 	java是纯面向对象的语言,因为java程序最小的单位是类。
		属性分为两种,一种是没有被static关键字修饰的,一种是带有static关键字的
		不带static修饰的属性叫做成员属性(变量)private int num; 
		带有static修饰的属性叫做静态属性(变量)private static String country;
	方法分三种:有一种特殊的方法叫做构造方法,这种方法不用写返回值类型,方法名为类名;
		另外两种方法:一种是没有被static关键字修饰的,一种是带有static关键字的
		不带static修饰的方法叫做成员方法:public void test();
		带有static修饰的方法叫做静态方法:public static void main(String[] args);
什么时候使用static:
	属性:成员属性和静态属性
	成员属性(变量): 这个属性(变量)是成员的,也就是说它是属于实例对象的,不同的对象有不同的属性值,
	或者是说变量的值不一样。
	例如:Person中有一个成员属性,private int idCard,这个属性是人的身份证号码,
	每个人身份证号都不一样,所以它的值依赖于实例对象,只有有具体的实例对象,
	这个属性的值才有具体的意义。
	比如说:小明还没出生,它就没有身份证号。只有小明诞生了,才会有身份证号。
	所以说,成员属性要有实际的意义,需要依赖实例对象,不同的对象,值代表的意思不一样。
	我们说这种属性,是对象相关的,它与对象息息相关,对象产生,它就产生,对象消亡,它就消亡。
	对象存在于堆内存空间中,对象一旦产生,它的成员属性就会在堆中被存储,且被赋值。
	对象一旦被GC回收,它的成员属性所占有的内存空间就会被释放。
————————————————
版权声明:本文为CSDN博主「solo_jie」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/solo_jie/article/details/113107966		
java中以类来组织程序 , 类体中所声明的变量被称为成员变量,体现对象的属性,类中的方法被称为成员方法 ,对于对类中声明的变量进行操作 ,体现对象所具有的行为
实例变量和类变量(静态变量)

实例变量和类变量都是类的成员变量 。成员变量在整个类都有效。
用关键字 static修饰的变量就是静态变量
没有用static修饰的变量是实例变量

总体来说,实例变量和静态变量的主要区别为以下三点。
·内存分配的空间——不同对象的同名实例变量分配不同的内存空间,变量之间的取值互不影响;不同对象的同名静态变量分配相同的内存空间,也就是说多个对象共享静态变量,改变其中一个对象的静态变量的值会影响其他对象中相应的静态变量的值。
·内存分配的时间——当类的字节码文件被加载到内存时,静态变量就分配了相应的内存空间;实例变量是当类的对象创建时才会被分配内存。
·访问方式——实例变量必须用对象名访问;静态变量可以用类名访问,也可以用对象名访问

实例方法和静态方法

实例方法和静态方法的主要区别如下
·内存分配的时间 ——当类的字节码文件 也就是 .class被加载到内存时时,静态方法就分配了相应的入口地址;实例方法是当类的对象创建时才会被分配入口地址。
·访问方式——实例方法必须用对象名访问;静态方法一般用类名访问,也可用对象名访问。
·操作的对象——静态方法只能操作静态变量,不能操作实例变量;而实例方法既可以操作静态变量也可以操作实例变量。
·另外实例方法中可以调用实例方法和静态方法,而静态方法中只能调用静态方法,不能调用实例方法。

静态属性(被static修饰的变量)
堆内存中只存放成员变量,栈内存中只存放局部变量。
	现在只剩下方法区内存,静态属性就存放在这里
	方法区内存的介绍:
		方法区内存存放的东西有哪些?代码片段的字节码,静态的数据,常量
		方法区内存是jvm中最先有内容的内存空间,这部分空间主要用来加载类的信息,
		加载类中代码片段的字节码,也就是各种.class文件。
		在类加载的过程中,遇到了static修饰的变量,就会在方法区内存空间中开辟空间存储并赋值。
		这是在main方法没有运行的时候,甚至可能连类的信息都还没有被加载完的时候,
		就已经给static修饰的变量开辟空间并赋值了。
		static修饰的变量,也就是静态变量,它是在类加载的时候开辟空间并赋值的,
		SUN公司这么做也就意味着,static修饰的变量是类级别的。它与对象无关。
		一个程序要运行,只有当与这个程序相关的所有的类都加载完毕以后,程序才会开始执行。
		因为我们说过,cpu要运算,寄存器就要有数据,寄存器要有数据,内存中就要有数据,
		否则,cpu不会运转。cpu都不工作,就不用谈程序的运行。所以,是先内存中有内容,
		然后通过总线给到寄存器,寄存器和CPU交互,再给回内存(或其他的设备内存),
		然后读写到硬盘(或者是输出到其他的设备)。
		java中jvm对类加载只进行一次,加载完毕后才会让程序正常执行。
		在加载的过程中,SUN公司为程序员准备了一些可以提前运行部分特殊代码的机制,
		这部分能在类加载的时候运行的代码是static修饰的属性的声明和赋值,以及static代码块。
		这种机制有一些好处,比如可以观测类加载的过程,可以在类加载的过程中输出日志,
		可以类加载完成之后程序运行的压力,提升程序运行的效率。
		比如Spring框架,Spring是管理对象的。未来我们的程序很大,有很多很多的对象,Spring来管,
		beanFactory,这是一个bean工厂,专门生产对象,
		有一些对象我们不需要在程序运行的时候再调用new 来产生,我们可以在类加载的时候就生产好。
在java中,有一些数据是与对象无关的,也就是说,由同一个类产生的对象,
不论是谁,变量值都不会改变,对象不存在,变量的值也存在。
这些数据就是静态的,它随着类的产生而产生,类的消亡而消亡。
类是一个模板,只有当方法区内存被清空的时候就消失了。
比如,我们都是中国人,中国人这个类中有一个属性叫做国籍,每个中国人对象都有这个属性,
且属性值都是"中国",这样的属性我们不应该给每个对象都给一份,这样浪费堆内存的存储空间。
只要是中国人这个类存在,国籍就一定存在。这样的数据只要有一份就可以了,
这一份数据是类加载的时候就已经赋值完成了。这样的数据我们就可以定义为static的,静态的。
这样的变量,也叫作类级别的变量。它只与类相关,与对象无关。

静态的数据:我们使用"类名."的方式访问。因为它是类级别的,只要是这个类存在,
这个数据就存在,不依赖对象。当然也可以用"引用."的方式访问。因为"引用"也是类这个类型的。
比如 Chinese类 有国籍这个静态属性,那么任何一个中国人都有这个属性,值一样都是中国。
Chinese zhangsan = new Chinese();
zhangsan.country = "China"; 这样做当然可以。因为zhangsan的类型是Chinese
实质上上述代码是Chinese.country。与对象无关,对象的引用之所以能访问这个属性,
是因为对象是它所在的类的类型。
zhangsan = null;
zhangsan.country = "China"; 这也是可以的,因为不是对象的引用在访问静态的变量,
而是"类名."的方式在访问。
静态的变量与对象无关,不论对象是谁,只要它是这个类的类型,就可以了。
Chinese zhangsan = null; 这个zhangsan的类型还是Chinese,类型一旦被定义是不会改变的。
所以zhangsan.country 本质上就是 Chinese.country.

静态属性的生命周期:类加载的时候产生,程序运行结束时消亡。(作用域)
成员属性的生命周期:当new的时候产生,当引用为null消亡
局部变量的生命周期:压栈的时候产生,弹栈的时候消亡

方法是指令的组织,它都是代码片段,都存放于方法区内存中,方法的执行都要压栈。
————————————————
版权声明:本文为CSDN博主「solo_jie」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/solo_jie/article/details/113107966
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值