一、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'>

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

热门产品

触发修改文章时间【fastadmincms开发记录】|fastadmincms二次开发,触发,修改,文章,时间,fastadmin,ms,开发,记录
触发修改文章时间【fastadmincms开发记录】
在tp5中过滤输入的零宽度字符【fastadmincms开发记录】|fastadmincms二次开发,在tp5中,过滤,输入,的零,宽度,字符,fastadmin,ms,开发,记录
在tp5中过滤输入的零宽度字符【fastadmincms开发记录】
处理tag标签中的0宽空格【fastadmincms开发记录】|fastadmincms二次开发,处理,tag,标签,中的,0宽,空格,fastadmin,ms,开发,记录
处理tag标签中的0宽空格【fastadmincms开发记录】
添加专题时tags标签id出错【fastadmincms开发记录】|fastadmincms二次开发,添加,专题,时tags,标签,id,出错,fastadmin,ms,开发,记录
添加专题时tags标签id出错【fastadmincms开发记录】
20230518----模板 广告【fastadmincms开发记录】|fastadmincms二次开发,20230518,模板,广告,fastadmin,ms,开发,记录
20230518----模板 广告【fastadmincms开发记录】
cms添加视频模型【fastadmincms开发记录】|fastadmincms二次开发,ms,添加,视频,模型,fastadmin,开发,记录
cms添加视频模型【fastadmincms开发记录】
新增单篇收费复制功能【fastadmincms开发记录】|fastadmincms二次开发,新增,单篇,收费,复制,功能,fastadmin,ms,开发,记录
新增单篇收费复制功能【fastadmincms开发记录】
添加开会员折扣功能【fastadmincms开发记录】|fastadmincms二次开发,添加,开会,折扣,功能,fastadmin,ms,开发,记录
添加开会员折扣功能【fastadmincms开发记录】

历史上的今天:05月03日

热门专题

云南巨榕教育投资集团有限公司|云南巨榕教育投资集团有限公司,巨榕教育集团,巨榕教育
云南巨榕教育投资集团有限公司
安徽中源管业有限公司|安徽中源管业有限公司,安徽中源管业有限公司介绍,安徽中源管业有限公司电话,安徽中源管业有限公司地址,安徽中源管业有限公司厂家,安徽中源管业有限公司电力管,安徽中源管业有限公司管材
安徽中源管业有限公司
国家开放大学|国家开放大学报名,国家开放大学报考,国家开放大学,什么是国家开放大学,国家开放大学学历,国家开放大学学费,国家开放大学报名条件,国家开放大学报名时间,国家开放大学学历,国家开放大学专业
国家开放大学
易捷尔单招|易捷尔单招,易捷尔单招培训,易捷尔单招报名,易捷尔单招考试,易捷尔单招培训学校,易捷尔单招分数
易捷尔单招
云南高职单招|云南单招,云南单招网,云南高职单招网,云南高职单招,云南单招学校,云南单招培训
云南高职单招
一年制中专|中专学历,中专是什么学历,中专是什么,中专有什么专业,中专升大专,一年制中专
一年制中专
昆明网站建设|昆明网站建设,昆明网站开发,昆明网站建设公司,昆明网站建设价格,昆明网站设计,昆明网站制作,网页设计,高端网站建设,高端网站设计
昆明网站建设
中源管业|中源管业,中源管业公司,中源管业有限公司,中源管业电话,中源管业地址,中源管业电力管,中源管业mpp电力管,中源管业cpvc电力管,中源管业pe穿线管
中源管业

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部