本篇文章给大家分享的是有关Java中静态的作用是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
<强>为什么需要静态的?强>
有时候我们并不想去新的一个对象,只是单纯的想要调用一个函数,并且希望这个函数不会与包含它的类的其他对象有所关联。说得通俗点,即使没有创建对象,也能通过类本身来调用函数。
<强>静态静态变量强>
被静态修饰的变量属于类变量,通过字面意思就说明了这个变量的归属(类),与之相对的是没有被静态修饰的成员变量,也称为实例变量,说明这个变量是属于某个具体的对象。
public class StaticDemo { ,private static  int 小姐:=,50; ,private int j =, 60; ,public static  void main (String [], args), { ,StaticDemo StaticDemo =, new StaticDemo (); ,StaticDemo staticDemo1 =, new StaticDemo (); ,//即使创建两个对象,也都指向同一存储空间 ,System.out.println (staticDemo.i); ,System.out.println (staticDemo1.i); ,//改变值 52=,staticDemo.i ; ,System.out.println (staticDemo1.i);=,staticDemo.j 65;=,staticDemo1.j 70; ,System.out.println (staticDemo.j); ,System.out.println (staticDemo1.j); ,} }
输出
50
引用>
50
52 65
70
通过上面的实例,我们很快看出他们的区别
<李>
静态变量是属于类的,只有一份存储空间,是类之间共享的,牵一发而动全身,一处变,处处变。
李> <李>实例变量属于实例对象,创建几次对象,就有几份的成员变量(拷贝)。
李><强>静态修饰的静态函数强>
说到静态函数,就不得不提Java另一个关键词,指的是当前的引用。意思是调用这个函数的对象,这意味着和静态修饰的函数水火不容。被静态修饰的函数,不能出现这关键字,否则便会报错。
去掉这个,分别调用我或者j,会发现静态函数调用非静态资源时出的错。这是为什么?从JVM加载机制角度来说,静态资源(被staitc修饰)是类在初始化的时候就加载的,而非静态资源是新的的时候加载的。类的初始化是早于新的加载了说()的函数时,它并不认识j这个成员变量,但对于非静态函数来说,当它加载时,静态资源已经加载完毕,所以它是认识我这个静态资源的。我们总结一下静态修饰函数时的特点
<李>
静态函数不能引用非静态资源;
李> <李>非静态函数可以引用静态资源;
李> <李>静态函数可以相互调用(只要引入所在包即可);
李> <李>静态函数没有,因为它不依附于任何对象。
李>现在,我们也能知道主函数为什么必须是静态的,因为程序在执行主要函数时候,没有创建任何对象,只是通过类名来访问。
<强>构造函数是不是静态函数? 强>
《Java编程思想》提到”即使没有显示地使用静态关键字,构造器实际上也是静态方法”。我至今不能确认构造器是不是静态函数,个人更偏向于不是。原因待会再阐述,先看个实例
public class StaticTest { ,private static  int 我; ,private int j; ,public StaticTest (int 我int j) {=,this.i 我; j=, this.j ; ,say1 () ,} ,public void  say1 () ,{ ,System.out.println(“你age 女儿家,,+,i); ,System.out.println(“你age 女儿家,,+,j); ,} ,public static  void main (String [], args) ,{ ,StaticTest StaticTest =, new StaticTest (4、5); ,StaticTest staticTest1 =, new StaticTest (69); ,System.out.println (staticTest.i); ,System.out.println (staticTest.j); ,System.out.println (staticTest1.i); ,System.out.println (staticTest1.j); ,} }输出
你年龄is4
你年龄is5
你年龄is10
你年龄is69
10
5
69Java中静态的作用是什么