java中的static关键字(详解)
static 关键字的几种常见用法:
1.修饰成员变量
一起来看一下代码中的例子:
public class javaSe0217 {
int age;
String name;
@Override
public String toString() {
return name+"==>"+age;
}
public static void main(String[] args) {
javaSe0217 p1=new javaSe0217();
p1.name="琪琪";
p1.age=10;
javaSe0217 p2=new javaSe0217();
p2.name="哈哈";
p2.age=20;
System.out.println(p2);
System.out.println(p1);
}
}
运行结果为:
其内存布局为:
从上面的内存布局可以知道P1和P2的引用分别对应堆区的两个对象,两者之间互不干扰,所有的成员属性由每个对象持有。但是两者共享toString()方法!
加上Static关键字后:
package javaSe0204;
public class javaSe0217 {
static int age;
String name;
@Override
public String toString() {
return name+"==>"+age;
}
public static void main(String[] args) {
javaSe0217 p1=new javaSe0217();
p1.name="琪琪";
p1.age=10;
javaSe0217 p2=new javaSe0217();
p2.name="哈哈";
p2.age=20;
System.out.println(p1);
System.out.println(p2);
}
}
运行结果为:
其内存布局为:
从内存布局可以知道,成员变量加上Static关键字后,这个属性变成类所持有的,跟对象无关,此时这个属性就是跟类相关,由所有的对象共享!
2.修饰成员方法
static修饰成员方法的用法比较简单,可以通过类.方法名进行调用,这样节省了创建对象的开销!通过代码来感受一下:
public class javaSe0217 {
static int age;
String name;
@Override
public String toString() {
return name+"==>"+age;
}
public static void eat(String name){
System.out.println(name+"正在吃饭!");
}
public static void main(String[] args) {
javaSe0217 p1=new javaSe0217();
p1.name="琪琪";
p1.age=10;
javaSe0217.eat(p1.name);//通过类直接调用
javaSe0217 p2=new javaSe0217();
p2.name="哈哈";
p2.age=20;
p2.eat(p2.name);//通过对象调用
}
}
运行结果为:
需要注意的是,在static修饰的方法中调用没有用static修饰的方法需要依托对象,否则就不能就会报错,可以加上static关键字即可!
3.静态代码块
4.静态导包
我们一下面一段代码为例:
package javaSe0204;
public class Test {
static void print(){
System.out.println("O");
}
}
package javaSeWork;
import static javaSe0204.Test.*;
public class jinTai {
public static void main(String[] args) {
print();
}
}
运行结果为:
上面的代码来自于两个java文件,其中的Test很简单,包含了一个用于打印的static方法。而在jinTai文件中,我们首先将Test类导入,这里在导入时,我们使用了static关键字,而且在引入类的最后还加上了**“.*”**,它的作用就是将Test类中的所有类方法直接导入。不同于非static导入,采用static导入包后,在不与当前类的方法名冲突的情况下,无需使用“类名.方法名”的方法去调用类方法了,直接可以采用"方法名"去调用类方法,就好像是该类自己的方法一样使用即可。
总结:
static是java中非常重要的一个关键字,而且它的用法也很丰富,主要有四种用法:
- 用来修饰成员变量,将其变为类的成员,从而实现所有对象对于该成员的共享;这里可以理解成类独有的一份,如果那个对象修改了其属性,之前的对象给这个属性的赋值操作就也跟着改变了!
- 用来修饰成员方法,将其变为类方法,可以直接使用**“类名.方法名”**的方式调用,常用于工具类;
- 静态块用法,将多个类成员放在一起初始化,使得程序更加规整,其中理解对象的初始化过程非常关键;其中要注意的是静态代码块只在类加载的时候执行一下,且只会执行一遍!!
- 静态导包用法,将类的方法直接导入到当前类中,从而直接使用**“方法名”**即可调用类方法,更加方便。