1.Static作用
被static所修饰的变量或者方法,会被称为静态变量或者 静态方法。在内存中,是跟着类的建立而建立的,所以,静态变量 与 静态方法,又被称为——类变量/类方法
要我们讲清楚static,我们得先了解清楚实例变量
1.1-实例变量
实例变量是什么? 1-只要没有被static修饰的都是实例变量
2-在内存区域中,是随着对象的创建而创建(被对象使用后)
3-类所实例化后的每一个对象,都有它自己独一份的实例变量
1.2-实例变量与静态变量的区别
所以实例变量与静态变量(或是类变量)的区别,就是静态变量的创建,是在该变量所在的类创建时一同闯将的。而实例变量,则是跟随着对象而创建。详细点说,静态变量创建在内存中方法区的常量池中,而实例变量是创建在堆中。且静态变量,无论你用该类实例化多少个对象,内存中都只有唯一一个静态变量,这个静态变量是属于类的,而不是属于对象的。所以每个对象在改变静态变量的时候,静态变量最后的存储的值,会选择最新变更的值(也就是最新一次对象修改静态变量的值)。
下图为 不实例化对象,直接打印静态变量
public class StaticTest {
public StaticTest(int age,String name) {
// TODO Auto-generated constructor stub
this.age = age;
this.name = name;
}
static String nation;//静态变量
private int age;//实例变量
private String name;//实例变量
public static void main(String[] args) {
StaticTest.nation = "Chinese";
System.out.println(StaticTest.nation);
}
}
可以看到我们在这里直接 类名.静态变量 调用了,接下来我们再测试一下不同对象调用静态变量之后的结果
StaticTest t1 = new StaticTest(10, "banney");
StaticTest t2 = new StaticTest(12, "cassie");
t1.nation = "柬埔寨";
System.out.println(StaticTest.nation);
对象t1修改了nation后,nation的值 是“柬埔寨”
那再用t2修改nation呢?
StaticTest t1 = new StaticTest(10, "banney");
StaticTest t2 = new StaticTest(12, "cassie");
t1.nation = "柬埔寨";
t2.nation = "中国!";
System.out.println(StaticTest.nation);
此处输出的
那我们再打印一下t1.nation!
System.out.println(StaticTest.nation);
System.out.println(t1.nation);
输出结果 自然都是中国! 因为静态变量只有一份,唯一的一分,内存中只会反复的改写,不会新开辟一块空间。 所以,被static修饰的静态变量,最后的结果,一定是最后一次对其进行的修改值,而且是跟着类的创建而创建,用类可以直接进行调用,不需要借助实例化后的对象
那我们自然抛出第二个问题,static修饰的方法呢?
1.3-静态方法
静态方法 也就是 被static所修饰的方法,同样能够通过类直接调用
!静态方法中,只能调用静态方法或者属性
非静态方法中,可以调用静态,也可以调用非静态
public class StaticTest {
public StaticTest(int age,String name) {
// TODO Auto-generated constructor stub
this.age = age;
this.name = name;
}
static String nation;//静态变量
private int age;//实例变量
private String name;//实例变量
public static void eat() {
System.out.println("im static");
}
public static void main(String[] args) {
StaticTest.eat();
}
}
StaticTest类中增加了一个静态方法:eat(); 可以直接用类.eat()进行使用
如果让eat静态方法中,去使用该类下的一个非静态变量,会如何呢?
private int age;//实例变量
private String name;//实例变量
public static void eat() {
System.out.println("im static"+age);
}
此处的age并不是静态变量,结果在运行后,报错了
我们将该变量改为静态后
private static int age;//实例变量
private String name;//实例变量
public static void eat() {
System.out.println("im static"+age);
}
即运行成功,=> 静态方法只能调用静态属性的方法与变量
注:操作静态变量的方法,也得为静态方法
例如类中,private static int id; 要get这个id,需要
public static int getId(){
return id;
}
并且静态方法内,不能使用this关键字,super关键字
静态变量或者方法随着类的加载而加载,随着类的消亡而消亡
2-static何时使用
开发中,我们什么时候使用static呢? 这个被static所修饰的属性 是要被多个对象所共享,且不会随着对象的更改而更改
而静态方法呢?则是我们在操作静态属性时,一般使用的是静态方法,安全问题
以及一些工具类的方法,例如math等方法