public class People { private String name; peopleTotal = 0; // 和上面的例子不同,这里的静态变量是私有的 public People (String name) { this.name = name; peopleTotal++; // 每次调用构造函数时候,使得类的peopleTotal静态变量加1 } getPeopleTotal () { return peopleTotal; // 通过静态方法访问私有静态变量 } }
Test.java:
public class Test { main(String args []) { People people1 = ); People people2 = ); People people3 = ); System.out.print(People.getPeopleTotal()); // 输出peopleTotal } }
结果 输出3
静态方法的各种性质和静态变量类似,它也是隶属于类而不是对象
上面我们都在强调一点,静态变量, 静态方法隶属于类而不是对象,那么你可能会因此问几个问题:
1.对象能够访问静态变量和静态方法吗? (静态变量/方法是否一定要由类调用?)
2.类内定义的实例方法能访问静态变量吗? (类内的静态变量是否一定要由静态方法调用?)
下面我将对这两个问题一一解答:
对象能够访问静态变量和静态方法吗?可以!
实际上,你可以用对象访问静态变量或方法,但你最好不要这样做,因为这容易造成混淆,具体一点说是混淆我们对“静态”的认知,实际上和对象毫无关系的静态变量用对象来调用,会造成我们在理解上的一种矛盾,这降低了程序的可读性。 用类名调用静态方法才是建议的操作
// 虽然能达到相同效果但不要这么做!! Test.java public class Test { main(String args []) { People people1 = ); People people2 = ); People people3 = ); System.out.print(people1.getPeopleTotal()); // 用people1对象调用了静态方法 } }
类内定义的实例方法能访问静态变量吗?
(类内的静态变量是否一定要由静态方法调用?)
可以!
答案当然是可以的,但请注意,如果一个方法仅仅只使用到静态变量(例如我们这个例子),那它应该作为一个静态方法,而不是实例方法,原因和上面相同,这容易混淆我们对于静态变量的认知
// 虽然能达到相同效果但不要这么做!! People.java: public class People { private String name; peopleTotal = 0; public People (String name) { this.name = name; peopleTotal++; // 每次调用构造函数时候,使得类的peopleTotal静态变量加1 } public int getPeopleTotal () { return peopleTotal; // 通过实例方法访问私有静态变量 } }
Test.java:
public class Test { main(String args []) { People people1 = ); People people2 = ); People people3 = ); System.out.print(people1.getPeopleTotal()); // 用people1对象调用了实例方法!! } }
【注意】上面说法的前提“一个方法仅仅只使用到静态变量”,如果一个方法不仅仅用到静态变量,情况就不一样了
main方法
我想每一个写java的筒子们应该都很熟悉的一段代码是public static void main(String args []){ ....}
1.在Java中,main()方法是Java应用程序的入口方法
2. java规范要求必须写成public static void main(String 字符串 []){ ....}的形式
除了字符串数组名称可以任意取,static,void和参数一律不可缺少
例如我如果省略static就会导致这一段报错: