静态变量
一、概念
静态变量就是用static关键字修饰的变量,该变量最大的特点就是会被该类中所有的实例对象共享
Child c1 = new Child();
c1.count++;
Child c2 = new Child();
c2.count++;
Child c3 = new Child();
c3.count++;
//最后的值,c1.count、c2.count、c3.count和Child.count是一样的。
class Child{
private String name;
public static int count = 0;
public Child(String name){
this.name = name;
}
public void join(){
sout("名字是:" + name);
}
}
二、静态变量放在那里?
不管是哪个版本,都不重要。重要的是:
- static变量被同一个类中所有实例对象所共享。(从下图中可以看见,任何一个Child类的实例对象都是指向了同一个静态变量count)
- static变量在类加载的就生成了。
三、静态变量的语法
定义静态变量:
- 访问修饰符 static 数据类型 变量名; //推荐这种
- static 访问修饰符 数据类型 变量名;
访问静态变量:(静态变量也遵守访问权限,即public, private......)
- 类名.静态变量名; //推荐这种(说明静态变量是随着类的加载而创建,即使没有创建实例对象也可以访问)
- 实例对象名.静态变量名;
四、静态变量细节
1、什么时候需要用静态变量
- 当我们需要让某个类的所有对象都共享一个变量时,就可以考虑使用静态变量。例如:定义Student类,统计所有学生共交多少钱Student(name, static fee)。
2、静态变量与实例变量的区别
- 静态变量是该类的所有实例对象所共享的,而实例变量是每个对象独享的。
3、加上static就是静态变量,否则是实例变量。
4、实例变量不能通过 类名.实例变量名 方式访问。
5、静态变量是在类加载时就初始化了,即使没有创建对象,只要类加载了,就可以使用静态变量
6、静态变量的生命周期是随着类加载开始,伴随着类消亡而销毁。
静态方法
一、静态方法的语法
定义静态方法:(和静态变量一样)
- 访问修饰符 static 数据类型 方法名; //推荐这种
- static 访问修饰符 数据类型 方法名;
访问静态方法:(静态方法也遵守访问权限,即public, private......)
- 类名.静态方法名; //推荐这种
- 实例对象名.静态方法名;
二、静态方法的细节
1、什么时候使用静态方法?
当方法中不涉及任何和对象有关内容,则可以将方法设计成静态方法,提高开发效率。例如,工具包util中的Math类、Array类、Collections集合类等。
说白了,就是方便调用,否则还要实例化对象,然后用对象调用类中的方法。用static方法,直接类名.方法名就行了。
Math.sqrt(9); //(sqrt是个static方法)结果就是3,直接用类名.方法名使用sqrt方法
2、静态方法也是方法,和普通方法一样,随着类的加载而加载,将结构信息存储在方法区。
3、静态方法中不能使用和对象有关的关键字,this关键字和super关键字,普通方法可以用。
4、静态方法与类有关,可以通过类名调用,也可以通过对象名调用。而普通方法与对象有关,需要通过实例对象调用。
5、静态方法只能访问静态变量和静态方法。而普通方法则是既可以方法普通变量(方法),也可以访问静态变量(方法)。
public int n1 = 1;
public static int n2 = 2;
public void say(){};
public static void hi(){};
public static void hello(){
sout(n1); //报错,因为n1不是静态变量
sout(n2); //正确,因为n2是静态变量
say(); //报错,因为say不是静态方法
hi(); //正确,因为hi是静态方法
}
Tips:无论是静态/非静态属性(方法),都要遵守修饰符访问权限!