static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象时,不生成static变量的副本,而是类的所有实例共享同一个static变量。
static修饰成员变量
如果有数据需要被共享给所有对象使用,此时就可以使用static修饰该成员变量.
静态成员变量的访问方式:
方式一: 可以使用对象进行访问。
格式: 对象.变量名。
方式二: 可以使用类名进行访问。
格式: 类名.变量名;
注意事项:
1. 非静态的成员变量只能使用对象进行访问,不能使用类名进行访问。
2. 不要为了方便访问数据而使用static修饰成员变量,只有成员变量的数据是真正需要被共享的时候才使用static修饰。
static修饰方法
使用static修饰的方法是属于整个类的类方法,它在内存中的代码段会随类的定义而被分配和装载;而非静态方法是属于具体对象的方法,当这个对象创建时,在对象的内存中会拥有此方法的专用代码段。调用静态方法时,可以使用对象名加前缀,也可以使用类名加前缀。比如classA 实例化了一个对象objectA,classA中定义了一个静态方法:run( ),则可使用 classA.run( ) 或者objectA.run( )来执行。
非静态方法既可以访问静态数据成员 又可以访问非静态数据成员,而静态方法只能访问静态数据成员;同样地非静态方法既可以访问静态方法又可以访问非静态方法,而静态方法只能访问静态数据方法。特别注意的是静态方法中的main方法,它作为程序运行的入口点,在每个程序中有且只能有一个。
静态方法的调用方式用两种:
方式一:可以使用对象进行访问。
对象.静态的函数名();
方式二:可以使用类名进行访问。
类名.静态函数名字。
推荐使用是类名直接调用静态方法,访问静态的成员变量也是如此。
为什么静态的方法不能引用普通的方法和属性呢?因为静态代码块是在类的class文件加载到内存的时候就马上执行的
一个类文件是在要使用的时候才会被加载到内存,而静态代码块是在类文件加载的时候就被执行的,所以静态成员的生命周期是优先于普通成员而存在的,Java虚拟机加载class文件采用的是惰性加载.
静态函数要注意的事项:
-
静态函数是可以调用类名或者对象进行调用的,而非静态函数只能使用对象进行调用。
-
静态的函数可以直接访问静态的成员,但是不能直接访问非静态的成员。原因是由于静态函数是可以使用类名直接调用的,这时候可能还没有存在对象,而非静态的成员数据是随着对象的存在而存在的。
-
非静态的函数是可以直接访问静态与非静态的成员。原因是非静态函数只能由对象调用,当对象存在的时候,静态数据老早就已经存在了,而非静态数据也随着对象的创建而存在了。
-
静态函数不能出现this或者super关键字。原因是因为静态的函数是可以使用类名调用的,一旦使用类名调用这时候不存在对象,而this关键字是代表了一个函数的调用者对象,这时候产生了冲突。
什么时候用static修饰一个函数呢?如果一个函数没有直接访问到非静态的成员时,那么就可以使用static修饰了。一般用于工具类型的方法
静态函数不能访问非静态的成员?静态函数只要存在有对象,那么也可以访问非静态的数据。只是不能直接访问而已,需要通过对象来调用。