【Java static关键字详解:静态变量与静态方法】 Java static关键字详解静态变量与静态方法static 变量static variable概念访问static 变量static 变量被所有对象共享static 方法static method概念Java 自带的 static 方法例子:static 方法不能直接访问非 static 成员变量非 static 方法可以直接访问 static 成员Main方法是staticstatic 和对象数量无关static 常量配合 final 使用Java 自带例子Math.PIstatic 变量static variable概念也叫类变量class variable。它属于整个类不属于某一个对象。类里所有对象共享同一个 static 变量。例子// Student类publicclassStudent{//是普通变量每个学生对象有自己的名字。Stringname;//是静态变量此类里所有学生对象共用一个学校名。staticStringschoolUW-Madison;publicStudent(Stringname){this.namename;}publicvoidprintInfo(){System.out.println(name goes to school);}}// Main类publicclassMain{publicstaticvoidmain(String[]args){Students1newStudent(Alice);Students2newStudent(Bob);s1.printInfo();//输出Alice goes to UW-Madisons2.printInfo();//输出Bob goes to UW-Madison}}访问static 变量static 变量可以通过类名访问System.out.println(Student.school);例子publicclassMain{publicstaticvoidmain(String[]args){System.out.println(Student.school);// 输出UW-Madison}}static 变量被所有对象共享例子// Student类publicclassStudent{Stringname;staticStringschoolUW-Madison;publicStudent(Stringname){this.namename;}}// Main类publicclassMain{publicstaticvoidmain(String[]args){Students1newStudent(Alice);Students2newStudent(Bob);System.out.println(s1.school);// UW-MadisonSystem.out.println(s2.school);// UW-MadisonStudent.schoolUIUC;//将所有student的学校名都改成了UIUCSystem.out.println(s1.school);// UIUCSystem.out.println(s2.school);// UIUC}}static 方法static method概念也叫类方法属于类本身不需要创建对象就能调用。调用格式ClassName.methodName();例子// 工具类方法平方// MathTools类publicclassMathTools{publicstaticintsquare(intx){returnx*x;}}// Main类publicclassMain{publicstaticvoidmain(String[]args){intresultMathTools.square(5);System.out.println(result);// 输出25}}不用写MathToolstoolnewMathTools();tool.square(5);Java 自带的 static 方法例子:平方根sqrtpublicclassMain{publicstaticvoidmain(String[]args){doubleresultMath.sqrt(25);// 返回值类型 变量名 类名.静态方法名(参数);System.out.println(result);// 输出5.0}}static 方法不能直接访问非 static 成员变量错误例子publicclassStudent{StringnameAlice;publicstaticvoidprintName(){System.out.println(name);// 错误}}正确方式创建对象再访问对象变量// Student类publicclassStudent{Stringname;publicStudent(Stringname){this.namename;}publicstaticvoidprintName(Students){System.out.println(s.name);}}// Main类publicclassMain{publicstaticvoidmain(String[]args){Students1newStudent(Alice);Student.printName(s1);// 输出Alice}}非 static 方法可以直接访问 static 成员例子publicclassStudent{Stringname;staticStringschoolUW-Madison;publicStudent(Stringname){this.namename;//当前这个 Student 对象的 name 传进来的name参数}publicvoidprintInfo(){System.out.println(name goes to school);}}publicclassMain{publicstaticvoidmain(String[]args){StudentsnewStudent(Carrie);s.printInfo();// 输出Carrie goes to UW-Madison}}Main方法是staticpublicstaticvoidmain(String[]args){}static 和对象数量无关普通变量每个对象一份static 变量整个类只有一份。publicclassDog{Stringname;//普通变量每只狗对象有不同名字staticintdogCount0;//静态变量整个类都用一个publicDog(Stringname){this.namename;dogCount;// 每创建一只狗对象constructor都会执行一次统计创建了多少个对象。}}publicclassMain{publicstaticvoidmain(String[]args){Dogd1newDog(Coco);Dogd2newDog(Lucky);Dogd3newDog(Happy);System.out.println(Dog.dogCount);// 输出3}}static 常量配合 final 使用static 经常和 final 一起用public static final double TAX_RATE 0.055;意思是设定一个变量初始化赋值后不能被修改值。例子publicclassStore{publicstaticfinaldoubleTAX_RATE0.055;publicstaticdoublecalculateTotal(doubleprice){returnpriceprice*TAX_RATE;}}publicclassMain{publicstaticvoidmain(String[]args){doubletotalStore.calculateTotal(100);System.out.println(total);// 输出105.5100100*0.055}}常量命名通常全大写如MAX_SCORE,PI,DEFAULT_SIZE,TAX_RATE。Java 自带例子Math.PIPI 是一个 static final 常量因为它不属于某个 Math 对象而且数值不应该被修改。publicclassMain{publicstaticvoidmain(String[]args){doubleradius2.0;doubleareaMath.PI*radius*radius;System.out.println(area);}}