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语法的规定。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 推荐使用C++ 11

    如果你的代码工作正常并且表现良好,你可能会想知道为什么还要使用C++11。当然了,使用用最新的技术感觉很好,但是事实上它是否值得呢? 在我看来,答案毫无疑问是肯定的。我在下面给出了9个理由

    2021年12月23日
  • idea2022.01.12mybatiscodehelperpro激活码(JetBrains全家桶)[通俗易懂]

    (idea2022.01.12mybatiscodehelperpro激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html4KDDGND3CI-eyJsaWN…

  • Wlan与WiFi[通俗易懂]

    Wlan与WiFi[通俗易懂]首先我们简单介绍下WLAN无线上网,其全称是:Wireless Local Area Networks,中文解释为:无线局域网络,是一种利用射频(Radio Frequency RF)技术进行据传输的系统,该技术的出现绝不是用来取代有线局域网络,而是用来弥补有线局域网络之不足,以达到网络延伸之目的,使得无线局域网络能利用 简单的存取架构让用户透过它,实现无网线、无距离限制的通畅网络。WLAN 使用

  • JWT单点登录(源码学习)

    JWT单点登录(源码学习)三、JWT源码学习//登录成功之后,需要生成tokenStringtoken=Jwts.builder().setSubject(“用户名/用户信息”)//主题,可以放用户的详细信息.setIssuedAt(newDate())//token创建时间.setExpiration(newDate(System.currentTimeMillis()+60000))//token过期时间.setId(“用户ID”)//用户ID

  • 自我学习总结之——NFV

    自我学习总结之——NFVNFV–DFC1.什么是NFV?网络功能虚拟化NFV(NetworkFunctionsVirtualization)在NFV出现之前设备的专业化很突出,具体设备都有其专门的功能实现,而之后设备的控制平面与具体设备进行分离,不同设备的控制平面基于虚拟机,虚拟机基于云操作系统,这样当企业需要部署新业务时只需要在开放的虚拟机平台上创建相应的虚机,然后在虚拟机上安装相应功能的软件包即可。这种方式…

  • 计算机组成原理期末复习90分以上选择填空大题总考点

    同学,你好!若觉得有用请点赞或关注~以后会发布更多有用的内容。2019-07-24更新:插入了一张“高分喷雾”。20…

发表回复

您的电子邮箱地址不会被公开。

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