Java中static关键字的作用与用法「建议收藏」

Java中static关键字的作用与用法「建议收藏」一、static关键字的特点:static是一个修饰符,用于修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能。1.static修饰成员方法static修饰的方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都必须依赖具体的对象才能够被调用。…

大家好,又见面了,我是你们的朋友全栈君。

一、static关键字的特点:

static是一个修饰符,用于修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能。

1. static修饰成员方法

       static修饰的方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都必须依赖具体的对象才能够被调用。

        但是要注意的是,虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。例如: 

Java中static关键字的作用与用法「建议收藏」

在上面的代码中,由于print2方法是独立于对象存在的,可以直接用类名调用。

假如说可以在静态方法中访问非静态方法/变量的话,那么如果在main方法中有下面一条语句:

   MyObject.print2();

 此时对象都没有,str2根本就不存在,所以就会产生矛盾了。同样对于方法也是一样,由于你无法预知在print1方法中是否访问了非静态成员变量,所以也禁止在静态成员方法中访问非静态成员方法。

  而对于非静态成员方法,它访问静态成员方法/变量显然是毫无限制的。

  因此,如果说想在不创建对象的情况下调用某个方法,就可以将这个方法设置为static。我们最常见的static方法就是main方法,至于为什么main方法必须是static的,现在就很清楚了。因为程序在执行main方法的时候没有创建任何对象,因此只有通过类名来访问。

2. static修饰成员变量

        static修饰的变量也称为静态变量,静态变量和非静态变量的区别是:静态变量被所有对象共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。

        static成员变量的初始化顺序按照定义的顺序进行初始化。

3. static修饰代码块

        static关键字还有一个比较重要的作用就是用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来依次执行每个static块,并且只会执行一次。

        static块可以优化程序性能,是因为它的特性:只会在类被初次加载的时候执行一次。如下:

 
  1. class Person{

  2. private Date birthDate;

  3.  
  4. public Person(Date birthDate) {

  5. this.birthDate = birthDate;

  6. }

  7.  
  8. boolean isBornBoomer() {

  9. Date startDate = Date.valueOf("1946");

  10. Date endDate = Date.valueOf("1964");

  11. return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;

  12. }

  13. }

isBornBoomer是用来判断一个人是否是1946-1964年出生的,而每次isBornBoomer被调用的时候,都会生成startDate和birthDate两个对象,造成了空间浪费,如果改成下面这样效率会更高:

 
  1. class Person {

  2. private Date birthDate;

  3. private static Date startDate, endDate;

  4.  
  5. static {

  6. startDate = Date.valueOf("1946");

  7. endDate = Date.valueOf("1964");

  8. }

  9.  
  10. public Person(Date birthDate) {

  11. this.birthDate = birthDate;

  12. }

  13.  
  14. boolean isBornBoomer() {

  15. return birthDate.compareTo(startDate) >= 0 && birthDate.compareTo(endDate) < 0;

  16. }

  17. }

因此,很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。

二、static关键字的误区

1. 与C/C++中的static不同,Java中的static关键字不会影响到变量的变量或者方法的作用域。在Java中能够影响到访问权限的只有private、public、protected这几个关键字。示例如下:

Java中static关键字的作用与用法「建议收藏」

提示错误,说明static关键字并不会改变变量和方法的访问权限。

2. 虽然对于静态方法来说没有this,但是我们在非静态方法中能够通过this访问静态方法成员变量。如下:

 
  1. public class Test {

  2.  
  3. static int value = 11;

  4.  
  5. public static void main(String[] args) {

  6.  
  7. new Test().printValue();

  8.  
  9. }

  10.  
  11. private void printValue() {

  12. int value = 22;

  13. System.out.println(this.value);

  14. }

  15. }

输出的结果是:11

这里的this表示的是当前对象,那么通过new Test()来调用printValue的话,当前对象就是通过new Test()生成的对象。而static变量是被对象所享有的,因此在printValue中的this.value的值毫无疑问是11。在printValue方法内部的value是局部变量,根本不可能与this关联,所以输出11。需要记住的是:静态成员变量虽然独立于对象,但是不代表不可以通过对象去访问,所有的静态方法和静态变量都可以通过对象访问(只要权限足够)。

3. 在C/C++中static关键字是可以作用于局部变量的,但是在Java中是不允许使用static修饰局部变量的。这是Java语法的规定。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/156520.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月9日 上午6:46
下一篇 2022年7月9日 上午7:00


相关推荐

  • 突发!万亿空间!OpenClaw企业级部署安装解决方案!

    突发!万亿空间!OpenClaw企业级部署安装解决方案!

    2026年3月13日
    3
  • [Matlab]绘图颜色[通俗易懂]

    [Matlab]绘图颜色[通俗易懂][Matlab]绘图颜色修改或规定Matlab中几何图形的颜色,对颜色可以有四种描述方法,分别是:颜色名称、短名称、RGB三元组、十六进制颜色代码。Matlab中较美观的颜色(RGB三元组)%%适用于Matlab的RGB颜色[0.00,0.45,0.74]//蓝[0.85,0.33,0.10]//橙红[0.93,0.69,0.13]//橙黄[0.72,0.27,1]//淡紫[0.47,0.67,0.19]//淡绿……待补充Matlab语言%%对点scat

    2022年5月31日
    49
  • 达梦数据库安装及配置图文教程 附DM8安装包

    达梦数据库安装及配置图文教程 附DM8安装包达梦数据库的安装欢迎使用新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入欢迎使用你好!这是你第一次使用M…

    2022年5月28日
    65
  • qoder怎么使用claude4

    qoder怎么使用claude4

    2026年3月15日
    2
  • windows中python虚拟环境virtualenv使用命令行workon的操作错误

    windows中python虚拟环境virtualenv使用命令行workon的操作错误windows 中 python 虚拟环境 virtualenv 使用命令行 workon 的操作错误使用命令 pipinstallvi 安装后 使用 workon 命令不起作用提示 workon 不是内部或外部命令 也不是可执行的程序只需要在后面加上 win 既可 再用 workon 就可以了 pipinstallvi win 创建虚拟环境

    2026年3月17日
    1
  • linux popd 命令,Linux shell中的pushd和popd命令「建议收藏」

    linux popd 命令,Linux shell中的pushd和popd命令「建议收藏」在linux的shell中可以使用pushd和popd命令方便地在多个目录之间切换。通过使用pushd和popd能够极大地提高效率。下面介绍下简单使用方法:0、使用cd-进行目录切换一般,Shell中都可以通过cd-命令回到之前的目录,下面是一个例子:$pwd/home/lfqy$cd/$cd-/home/lfqy$实际上,cd-中,-就相当于变量$OLDPWD。cd-就相当…

    2022年6月15日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号