------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
一.static的引入
Static表示“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块.被static修饰的成员变量和成员方法独立于该类的 任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法 区内 定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。对于一些已经有固定值的变量,每次实例化对 象都会产生空间,其值基本是固定了,为了防止过多的存储此变量造成空间浪费,我们可以将此变量声明为static(静态)。
二.static标记后注意事项
1.static应用范围:可用于内部类、方法和变量.
2.标记一个方法为static,意味着这个方法,被所在类的所有实例公用,在类装载时被首先执行,执行一次即被所有该类的实例共享,同时意味着:
1)static方法内部不能引用非static变量.
2)static方法不能被子类重写为非static方法.
3)父类的非static方法不能被子类重写为static方法.
4)static代码块可以用static {}来完成,在类被第一次装载时执行初始化,先于静态方法和其他方法的执行.
5)static方法区内不能定义this和super关键字.
6)静态方法只能访问静态成员,非静态方法,可以访问静态和非静态成员;
3、标记一个变量为static,则该变量在内存中有不变的位置,所有类的实例都访问同一个存储变量区域。对其修改对于所有类的实例来说都是可见和一致的。
举例:
<span style="white-space:pre"> </span>class Student
<span style="white-space:pre"> </span>{
static String Name1 = "Welcome";
static int a=1;
static void show(){
//静态的方法无法访问非静态的成员
// System.out.println( stuName );
System.out.println(Name1);
}
static void show1(){
int a=2;
System.out.println(a);
//System.out.println(this.a);//静态方法里不能定义this
}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>class Test1
<span style="white-space:pre"> </span>{
public static void main(String[] args)
{
Student.show();//静态方法可以通过类名直接调用
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
三.应用
1.静态的成员属性的应用
如果某些变量有固定的值,而且需要被整个工程共享,这时可以将这些变量定义在某个类中,并全部声明为static的,以方便被所有项目组使用;
例如PI值,我们在计算圆面积时,因为需要一个精度标准,整个项目都定义PI=3.14159,这时我们把PI定义为静态就可以了.
<span style="white-space:pre"> </span>class PiNum
<span style="white-space:pre"> </span>{
static double PI = 3.14159;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>class Test1
<span style="white-space:pre"> </span>{
public static void main(String[] args)
{
System.out.println(PiNum.PI);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
因为PI已经被静态了,所以在整个项目中需要用的时候就直接用类名访问就可以了,非常的方便.
2.静态方法的应用
在整个项目中,会有一些方法,被全局使用;它们经常是一些"功能性的方法"。例如:加、减、乘、除、求数组的最大值,最小值;都会将这些功能封装成一个方 法,供整个程序使用;此时,可以将这些功能性的方法,放到一个类中,并且声明为static,可以直接通过类名就可以调用了,使用很方便;
举例:
class MyMath
{
static int add(int a ,int b){
return a + b;
}
static int sub(int a ,int b){
return a - b;
}
static int mul(int a ,int b){
return a * b;
}
static int div(int a ,int b){
return a/b;
}
}
class Test1
{
public static void main(String[] args)
{
System.out.println("a + b="+new MyMath().add(5,2));//之前的普通方法,必须要先实例化此类对象才可以调用;
System.out.println("a + b="+MyMath.add(5,2));//通过类名就可以调用静态方法;
System.out.println("a + b="+MyMath.sub(5,2));
System.out.println("a + b="+MyMath.mul(5,2));
System.out.println("a + b="+MyMath.div(5,2));
}
}
如果这些方法没有使用静态方法,那么在调用的时候就必须得实例化对象才能调用,而静态后直接用类名访问就行.