一、Java静态属性
一个类中定义的属性,称之为实例属性。实例属性的特点是,每个实例都有独立的字段,各个实例的同名字段互不影响。有一种特殊的是用static修饰的属性,称为静态属性(static field)。实例属性在每个实例中都有自己的一个独立“空间”,但是静态属性只有一个共享“空间”,所有实例都会共享该属性。举个栗子:
class Person {
public String name;
public int age;
// 定义静态属性score:
public static int score;
}
大家来一起看看下面的完整代码,这个代码非常好的能说明静态属性,对于静态字段,无论修改哪个实例的静态字段,效果都是一样的:所有实例的静态字段都被修改了,原因是静态字段并不属于实例。
图片由上图代码所示,虽然实例可以访问静态属性,但是它们指向的其实都是Person(class)的静态属性。所以,所有实例共享一个静态属性。因此,不推荐用实例变量.静态属性去访问静态属性,因为在Java程序中,实例对象并没有静态属性。在代码中,实例对象能访问静态属性只是因为编译器可以根据实例类型自动转换为类名.静态属性来访问静态对象。
推荐用类名来访问静态属性。可以把静态属性理解为描述class本身的字段(非实例字段)。因此,对于上面的代码,更好的写法是:
Person.score = 99;
System.out.println(Person.score);
二、Java静态方法
除了静态属性,还有静态方法。用static修饰的方法称为静态方法。调用实例方法必须通过一个实例变量,而调用静态方法则不需要实例变量,通过类名就可以调用,例如:
public class Main {
public static void main(String[] args) {
#通过类名就可以调用
Person.setScore(98);
System.out.println(Person.score);
}
}
class Person {
public static int score;
public static void setScore(int value) {
score = value;
}
}
Java结果如下:
图片
因为静态方法属于class而不属于实例,因此,静态方法内部,无法访问this变量,也无法访问实例属性,它只能访问静态属性。
静态方法经常用于工具类。例如:
Arrays.sort()
Math.random()
注意到Java程序的入口main()也是静态方法。
三、Python静态的理解
Python中没有专门的静态属性,Python中并没有像 C/C++、 Java那样定义静态属性的关键字 static,因为不同于上述静态语言,Python属于动态语言。Python的类某种意义上就是个语法糖。一个函数写在类里面和写在类外面没有区别,唯一的区别就是参数,所谓实例方法就是第一个参数是self,所谓类方法就是第一个参数是class,而静态方法不需要额外的参数,所以必须区分。
举个栗子,下面代码先后列举了实例方法、静态方法(staticmethod)和类方法(classmethod)的一些使用场景。定义一个实例方法,静态方法和类方法,并分别进行调用。
class A(object):
#实例方法
def im(self):
print ('Instance method: ', self)
#类方法
@classmethod
def cm(cls):
print ('Class method: ', cls)
return cls
#静态方法
@staticmethod
def sm():
print ('Static method.')
调用过程如下:
>>> A().im() 在实例上调用实例方法
Instance method: <A.A object at 0x7f95dfb19210>
>>> A().sm() 在实例上调用静态方法
Static method.
>>> A().cm() 在实例上调用类方法
Class method: <class 'A.A'>
>>> A.im() 在类上调用实例方法,出错!!
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unbound method im() must be called with A instance as first argument (got nothing instead)
>>> A.sm() 在类上调用静态方法
Static method.
>>> A.cm() 在类上调用类方法
Class method: <class 'A.A'>
发表评论 取消回复