各类编程语言中static关键字的用法

最近在各种语言之间来回编程,容易产生混乱,这里特意整理下:

一. c语言(面向过程)

在c语言中static 可以修饰变量跟函数,并且修饰后,只在本文件中可见,别的文件中可以使用同名变量或函数。因此添加static 有利于团队协作中出现命名相同编译识别的情况。

1. 修饰变量

在介绍修饰变量作用之前,读者应该要对c程序存储结构有一定的认知,存储结构说明
(1) 存储方式:

类别 局部变量存储位置 全局变量存储位置
修饰 静态存储区(.data段) 静态存储区(.data段)
不修饰 栈(stack) 静态存储区(.data段)

(2)作用和可见性:

类别 局部变量 全局变量
修饰 函数退出后数据不会清除 仅在同文件下全局可见
不修饰 函数退出后自动清除数据 程序内全局可见

2. 修饰函数

(1)

类别 有无static 可见性
静态函数 有static 静态函数只是在声明他的文件当中可见,不能被其他文件所用。
普通函数 无static 程序内可见,默认自带extern

二. 面向对象类语言

在介绍语言修饰作用前,先说明一下,语言发展关系:c (面向过程)—> c++ 、c#、java、go、php、python (面向对象), 从中我们可以看出其他面向对象的语言是由c发展而来的,在存储和作用上会有一定的相似性。由于面向对象有个共同特点就是增加了类,所以下面主要介绍 staic 对类的影响。

在使用类成员中,我们通常需要创建一个对象,通过对象来访问类成员。而使用static修饰后会改变访问方式。this被即为本对象,成员函数被static修饰之后,不能使用this。

在运用多种编程语言中,可以发现带static 的 类函数,可以方便被直接调用,而不需要使用new 创建对象。
不过由于类静态函数不能访问非静态函数,因此在某些时候容易产生错误。

1. C++

(1)C++ 继承c语言的面向过程,所以具备c的特性

(2)修饰类成员

语言 作用 可见性 调用格式
变量 静态成员变量是每个类有一份,普通成员变量是每个实例有一份 变更 <类名>::<类变量>
函数 静态成员函数,可以用类名::函数名进行访问,但无法使用this,仅能访问类的静态数据和静态成员函数。 变更 <类名>::<函数名>或<对象名>.<函数名>

补充注意点:

  • 静态成员函数不能访问非静态(包括成员函数和数据成员),但是非静态可以访问静态。
  • 不能将静态成员函数定义为虚函数。
  • 静态成员变量地址是指向其数据类型的指针 ,静态成员函数地址类型是一个“nonmember函数指针”。
  • 为了防止父类的影响,可以在子类定义一个与父类相同的静态变量,以屏蔽父类的影响。

2. JAVA

(1)简介

在java语言中类中的函数被称为方法。
在《Java编程思想》中有这样一段话:
  “static方法就是没有this的方法在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途“。这段话虽然只是说明了static方法的特殊之处,但是可以看出static关键字的基本作用,简而言之,一句话来描述就是:
  方便在没有创建对象的情况下来进行调用(方法/变量)。

(2) 其他作用

  • static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
class 类名{
    private String test;  
    static{
        test = "test";   
    }     
}
  • static是不允许用来修饰局部变量。
  • static关键字不会影响到变量或者方法的作用域。在Java中能够影响到访问权限的只有private、public、protected(包括包访问权限)

3. 其他语言

  • 基本上大同小异
展开阅读全文

没有更多推荐了,返回首页