一.类变量
1.类变量引出
假如我们有一群小孩子在打雪仗,打雪仗的过程中,不断有新的小孩子加入,那么我们统计最后一共有多少小孩子打雪仗了......
传统的方法肯定是先定义一个孩子类,该类下定义一个打雪仗方法,然后在对象外面定义一个计数的变量,该变量在每次调用打雪仗方法的时候都执行一次,进行累加,代码如下:
package com.study.static_;
public class ChildGame {
public static void main(String[] args) {
int count = 0;
Child child1 = new Child("小王");
Child child2 = new Child("小张");
Child child3 = new Child("小强");
child1.play();
count++;
child2.play();
count++;
child3.play();
count++;
System.out.println("最终打雪仗的有"+count+"人");
}
}
class Child{
public String name;
public Child(String name) {
this.name = name;
}
public void play(){
System.out.println(name+"加入了打雪仗");
}
}
运行结果:
问题分析:
count是一个独立于对象,很尴尬啊,我们访问count很麻烦,没有用到oop,因此我们引出类变量/静态变量。
2.什么是类变量
类变量也叫静态变量/静态属性,是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量。
3.定义类变量(语法)
访问修饰符 static 数据类型 变量名 ;【推荐】
static 访问修饰符 数据类型 变量名;
4.访问类变量
类名.类变量名【推荐】
对象名.类变量名
静态变量的访问修饰符的访问权限和范围和普通属性是一样的
对打雪仗代码优化如下:
package com.study.static_;
public class ChildGame {
public static void main(String[] args) {
Child child1 = new Child("小王");
Child child2 = new Child("小张");
Child child3 = new Child("小强");
child1.join();
Child.count++;
child2.join();
Child.count++;
child3.join();
Child.count++;
}
}
class Child{
public String name;
public static int count=1;
public Child(String name) {
this.name = name;
}
public void join(){
System.out.println(Child.count+"加入了打雪仗");
}
}
5.注意事项
1.当需要让某个类所有对象都共享一个变量时,可以考虑使用类变量。
2.类变量是在类加载时就初始化了,也就是说,即使没有创建对象,只要类加载了,就可以使用类变量,sure也会随着类消亡而消亡。
二.类方法
1.类方法引出
2.定义类方法(语法)
访问修饰符 static 数据返回类型 方法名();【推荐】
static 访问修饰符 数据返回类型 方法名();
3.类方法的调用
类名.类方法名【推荐】
对象名.类方法名
4.使用细节
1.类方法中无this的参数,普通方法中隐含着this的参数,二者都是随着类的加载而加载,将结构信息存储在方法区;
2.类方法中不允许使用和对象有关的关键字,比如super ,this;
3.类方法中只能访问静态方法或静态变量。
package com.study.static_;
public class StaticMethod {
public static void main(String[] args) {
Student.Payfee(100);
Student.Payfee(100);
Student.Showfee();
}
}
class Student{
private String name;
private static double fee;
public Student(String name) {
this.name = name;
}
public static void Payfee(double fee){
Student.fee+=fee;
}
public static void Showfee(){
System.out.println("总学费:"+Student.fee);
}
}
上述代码中fee是静态变量,所以在类方法每次被调用的时候,用的该变量都是同一个,所以最后输出结果应为100+100=200。