一、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 条评论

暂无评论

热门产品

php编程基础教程.pptx|php编程培训,php,编程,基础,教程,pptx
php编程基础教程.pptx

历史上的今天:04月20日

ThinkPHP5快速入门基础

ThinkPHP5快速入门基础一、基础快速入门 ( 一 ) :基础本章介绍了 ThinkPHP5 .0 的安装及基本使用 ,并给出了一个最简单的示例带你了解如何开始开发 ,主要包 含 :简介官网下载 omposer安装和更新CGit下载和更新目录结构运行环境入口文件调试模式控制器视图读取数据总结在学习 ThinkPHP5.0 之前 ,如果你还不理解面向对象和命名空间的概念 ,建议首先去PHP手册恶

ThinkPHP5快速入门

ThinkPHP5快速入门目 录零、序言一、基础二、URL和路由三、请求和响应四、数据库五、查询语言六、模型和关联 (1)模型定义 (2)基础操作 (3)读取器和修改器 (4)类型转换和自动完成 (5)查询范围 (6)输入和验证 (7)关联 (8)模型输出七、视图和模板八、调试和日志九、API开发十、命令行工具十一、扩展十二、杂项SessionCookie验证

热门专题

APP开发|app开发_app开发公司_app软件开发_专业app开发_云南app开发公司_app定制_原生app开发定制
APP开发
弥勒综合高中|弥勒综合高中
弥勒综合高中
昆明综合高中|昆明综合高中
昆明综合高中
云南高职单招|云南单招,云南单招网,云南高职单招网,云南高职单招,云南单招学校,云南单招培训
云南高职单招
云南网站建设|云南网站制作,网站建设,云南网站开发,云南网站设计,云南网页设计,云南网站建设公司,云南网站建设
云南网站建设
综合高中|云南综合高中,昆明综合高中,综合高中能考本一吗,综合高中和普通高中的区别,综合高中是什么意思,综合高中能参加全国统一高考吗,综合高中可以考哪些大学,综合高中的学籍是什么
综合高中
安徽中源管业|安徽中源管业,安徽中源管业mpp电力管,安徽中源管业cpvc电力管,安徽中源管业pe穿线管,安徽中源管业电力管,安徽中源管业排水管,安徽中源管业通信管,安徽中源管业管材
安徽中源管业
一年制中专|中专学历,中专是什么学历,中专是什么,中专有什么专业,中专升大专,一年制中专
一年制中专

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部