9.10 静态属性和静态方法

对象的属性是每个对象都有自己的一份,例如学生类的学号、姓名,每一个学生对象,都有不同的学号姓名,这是很自然的。我们把这些称为对象的属性,前面已经讲过。

但是有一种属性,是所有对象共享的,这种叫做静态属性,或者类属性,它无需任何对象就能存在,通常都是全部大写的。这类属性需要在前面加关键字static:
public class Mobile{static int NUM=100;String name;String mon;}

NUM这个属性是所有对象共享的,而使用的话,是这样的:
public static void main(String[]args){Mobile mobile1=new Mobile();mobile1.NUM--;Mobile mobile2=new Mobile();mobile2.NUM--;Mobile.NUM--;System.out.println(Mobile.NUM);}

最后会打印97。注意这条语句Mobile.num--,表明了num这个属性完全不需要任何对象,就能存在,事实上,读取或者修改静态属性,往往是"类名.静态属性"这样的形式,如果使用“对象.静态属性”,编译器会出警告。

例如学生类,有一个属性是学校名称,这是所有学生对象都相同的,如果学校改名了,所有学生对象的学校名都改了。
修改这类属性,不需要通过对象:

Student.school="清华大学";

Student就是类名。使用这样形式的其实我们已经使用过了,它就是

System.out.println();
在这里System是一个类,out是它的一个类属性(out的类型是java.io.PrintStream,也就是说out是PrintStream的一个对象)。这里根本没有System对象。

和静态属性对应的,是静态方法。
静态方法,一种不需要对象就能调用的方法。这是一个Math类方法的调用,计算x的绝对值:

int x=-9;
int m=Math.abs(x);
System.out.println(m);

最终打印9,也即是-9的绝对值。绝对值函数abs的调用,不需要Math对象,事实上,Math类全部都是静态方法,它就是一个提供了数学函数的一个集合体。并不需要创建一个对象。

main函数就是静态方法。
1.任何方法(静态或者非静态)都可以调用静态方法,都可以使用静态属性
2.静态方法不可以调用非静态方法,不可以使用非静态属性
关于第二点,可以这样理解:静态方法调用不需要对象,所以不存在属性和行为,而非静态属性和方法就是一个对象的属性和行为。