目录
概念引入:
在类中,用static声明的成员变量为静态成员变量,也称为类变量,什么是类变量呢?比如我们在方法中定义的变量可以叫做方法变量,它的作用域仅仅在方法内。他的生命周期和方法相同。那么同样的,类变量就是作用域在整个类中的变量。类变量的生命周期和类相同,即在整个类程序执行期间都有效。
static作用:
被static修饰的成员变量和方法,从属于类,可以直接被类调用,那么对应的普通变量和方法从属于对象,也就是可以被对象调用,调用方式:
对于类变量和类方法:类名.类变量/方法
对于普通变量和普通方法:对象.普通变量/方法
代码演示:
public class StaticTest {
public static void main(String[] args) {
Chinese c1=new Chinese();
c1.name="tom";
c1.age=12;
Chinese c2=new Chinese();
c2.name="xiaoming";
c2.age=22;
Chinese.nation="CHN";
//Chinese类中的静态变量nation,被类名直接调用。并且没有报错
System.out.println(c1.nation);//输出CHN
}
}
class Chinese{
String name ;
int age;
static String nation ;
}
为什么静态方法不能调用非静态方法和成员,编译会报错?
这个需要从一个类的加载说起,静态方法/成员是属于类的,即静态方法/成员是随着类的加载而加载的,在加载类时,程序就会为静态方法/成员分配内存,而非静态方法是属于对象的,对象是在类加载之后被创建的,也就是说静态方法/成员先于对象存在,在静态方法/变量加载之前是没有非静态的方法和成员的,你调用一个不存在的方法或变量,程序就会报错。所以静态方法中不能有非静态的方法或者成员。
当你创建一个对象时,程序为其在堆中分配内存,一般是通过this指针来指向该对象。静态方法是不依赖于对象的调用的,它是通过‘类名.静态方法名’这样的方式来调用的。而对于非静态方法,在对象创建的时候程序才会为其分配内存,然后通过类的对象去访问非静态方法。因此在对象未存在时非静态方法也不存在,静态方法自然不能调用一个不存在的方法。但是在非静态成员方法中是可以访问静态成员方法和静态成员变量,因为静态的方法和变量优先于非静态的方法和变量出现,所以可以调用。
static方法也成为静态方法,由于静态方法不依赖于任何对象就可以直接访问,因此对于静态方法来说,是没有this的,因为不依附于任何对象,既然都没有对象,就谈不上this了,并且由于此特性,在静态方法中不能访问类的非静态成员变量和非静态方法,因为非静态成员变量和非静态方法都必须依赖于具体的对象才能被调用。
static关键字的用途
方便在没有创建对象的情况下进行直接被类去调用(方法/变量)。
static可以用来修饰类的成员方法、类的成员变量,另外也可以编写static代码块来优化程序性能
static方法
两个实际应用问题
开发中,如何确定一个属性是否要声明为static的?
> 属性是可以被多个对象所共享的,不会随着对象的不同而不同的。
开发中,如何确定一个方法是否要声明为static的?
> 操作静态属性的方法,通常设置为static的
> 工具类中的方法,习惯上声明为static的。比如:Math类