如何掌握static关键字

技术如何掌握static关键字本篇内容介绍了“如何掌握static关键字”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!“

本文介绍了“如何掌握静态关键词”的相关知识。很多人在实际案例的操作中会遇到这样的困难。让边肖带领你学习如何处理这些情况。希望大家认真阅读,学点东西!

“哥,一个星期过去了,你还没更新教妹学Java,你太懒了!”三姐关切地问我。

“今天更新。”我笑着对三姐说:“学习不能落下。今天,让我们学习一下Java中的静态关键字。”

“静态是Java中比较难的一个关键词,也是各大公司面试官最喜欢问的知识点之一。”我喝了口咖啡,继续说道:

“既然是面试的重点,我就要好好学习。”三姐连忙说道。

“static关键字的功能可以用一句话来描述:lsquo在不创建对象(包括变量和方法)的情况下调用很方便。也就是说,只要加载了类,就可以通过类名来访问它。”我举起沉重的眼镜继续说道,“静态可以用来修改一个类的成员变量和成员方法。我们一个一个来看。”

01.静态变量。

“如果在声明变量时使用了static关键字,那么这个变量就称为静态变量。静态变量在类加载时只获得一次内存空间,这使得静态变量节省了内存空间。”房子里的暖气有点充足,于是我跑过去打开一扇小窗,继续说。

“考虑这样一个学生班。”话音刚落,我就敲了敲键盘。

公共课学生{字符串名称;国际年龄;字符串学校='郑州大学';}

打完这段代码,我对三姐说:“如果郑州大学招收了一万名新生,在创建一万个Student对象时,所有字段(姓名、年龄、学校)都会得到一块内存。学生的名字和年龄不同,但都属于郑州大学。如果每一个物体都被创造出来,学校的场地就会占据一片记忆,这是一种浪费,对吗?三姐。"

“因此,最好将学校的场地设置为静态,这样只会占用一块内存,而不是一万块。”

安静的房子里有噼啪作响的键盘声。

公共课学生{字符串名称;国际年龄;静弦学校='郑州大学';公共学生(字符串名,整数){ this.name=namethis.age=年龄;} public static void main(string[]args){ student 1=new student(' silent king 2 ',18);学生s2=新生(《沉默的国王三世》,16);}}

“看,三妹。两个引用变量s1和s2存储在堆栈中,对象Silent King 2 18和对象Silent King 3 16存储在堆中,静态变量school存储在静态区域中。”

“等等,兄弟,栈,堆,静态区?”三姐的脸上满是疑惑。

“哦哦,别担心,三姐,画个画就什么都懂了。”之后,我打开了draw.io的网站,仔细的画了一幅画。

如何掌握static关键字

“现在,你一下子明白了吗?”看着这张漂亮的手绘,我觉得有点开心。

“哇,兄弟,太神奇了!”三姐不忘拍我马屁,给了我一个大大的恭维。

“好了,三姐,我们来看看下面的代码。”

公共类计数器{ int count=0;counter(){ count;system . out . println(count);}公共静态void main(String args[]){ Counter C1=new Counter();计数器c2=新计数器();计数器c3=新计数器();}}

“我们创建一个成员变量,计数,并在构造函数中增加它。因为成员变量在创建对象时会获得内存,所以每个对象都会有一个count的副本,count的值不会随着对象的增加而增加。”

我正聊着聊着,三姐好像有点迷糊。

“没关系,三姐,你可以先瞎猜。这个代码的输出结果是什么?”

“按照你的逻辑,你应该输出三个一?是这样吗?”三姐眨了眨眼睛,有点不太自信地回答。

“哦,还不错。”

我在IDEA中点击了运行按钮,程序就启动了。

111

每次创建计数器对象时,计数的值都会从0增加到1。三姐,你想想。如果计数是静态的呢?

?”

“我不知道啊。”

“嗯,来看下面这段代码。”

public class StaticCounter { static int count = 0; StaticCounter() { count++;  System.out.println(count); } public static void main(String args[]) {  StaticCounter c1 = new StaticCounter(); StaticCounter c2 = new StaticCounter();  StaticCounter c3 = new StaticCounter(); }}

“来看一下输出结果。”

123

“简单解释一下哈,由于静态变量只会获取一次内存空间,所以任何对象对它的修改都会得到保留,所以每创建一个对象,count 的值就会加 1,所以最终的结果是  3,明白了吧?三妹。这就是静态变量和成员变量之间的差别。”

“另外,需要注意的是,由于静态变量属于一个类,所以不要通过对象引用来访问,而应该直接通过类名来访问,否则编译器会发出警告。”

如何掌握static关键字

02、 静态方法

“说完静态变量,我们来说静态方法。”说完,我准备点一支华子来抽,三妹阻止了我,她指一指烟盒上的「吸烟有害身体健康」,我笑了。

“好吧。”我只好喝了一口咖啡继续说,“如果方法上加了 static 关键字,那么它就是一个静态方法。”

“静态方法有以下这些特征。”

静态方法属于这个类而不是这个类的对象;

调用静态方法的时候不需要创建这个类的对象;

静态方法可以访问静态变量。

“来,继续上代码”

public class StaticMethodStudent { String name; int age; static String school  = "郑州大学"; public StaticMethodStudent(String name, int age) { this.name = name;  this.age = age; } static void change() { school = "河南大学"; } void out() {  System.out.println(name + " " + age + " " + school); } public static void  main(String[] args) { StaticMethodStudent.change(); StaticMethodStudent s1 = new  StaticMethodStudent("沉默王二", 18); StaticMethodStudent s2 = new  StaticMethodStudent("沉默王三", 16); s1.out(); s2.out(); }}

“仔细听,三妹。change() 方法就是一个静态方法,所以它可以直接访问静态变量 school,把它的值更改为河南大学;并且,可以通过类名直接调用  change() 方法,就像 StaticMethodStudent.change() 这样。”

“来看一下程序的输出结果吧。”

沉默王二 18 河南大学沉默王三 16 河南大学

“需要注意的是,静态方法不能访问非静态变量和调用非静态方法。你看,三妹,我稍微改动一下代码,编译器就会报错。”

“先是在静态方法中访问非静态变量,编译器不允许。”

如何掌握static关键字

“然后在静态方法中访问非静态方法,编译器同样不允许。”

如何掌握static关键字

“关于静态方法的使用,这下清楚了吧,三妹?”

看着三妹点点头,我欣慰地笑了。

“哥,我想到了一个问题,为什么 main 方法是静态的啊?”没想到,三妹串联知识点的功力还是不错的。

“如果 main 方法不是静态的,就意味着 Java 虚拟机在执行的时候需要先创建一个对象才能调用 main 方法,而 main  方法作为程序的入口,创建一个额外的对象显得非常多余。”我不假思索的回答令三妹感到非常的钦佩。

“java.lang.Math 类的几乎所有方法都是静态的,可以直接通过类名来调用,不需要创建类的对象。”

如何掌握static关键字

03、静态代码块

“三妹,站起来活动一下,我的脖子都有点僵硬了。”

我们一起走到窗户边,映入眼帘的是从天而降的雪花。三妹和我都高兴坏了,迫不及待地打开窗口,伸出手去触摸雪花的温度,那种稍纵即逝的冰凉,真的舒服极了。

“北国风光,千里冰封,万里雪飘。望长城内外,惟余莽莽;大河上下,顿失滔滔。山舞银蛇,原驰蜡象,欲与天公试比高。须晴日,看红装素裹,分外妖娆。。。。。。”三妹竟然情不自禁地朗诵起了《沁园春·雪》。

确实令人欣喜,这是 2020 年洛阳的第一场雪,的确令人感到开心。

片刻之后。

“除了静态变量和静态方法,static 关键字还有一个重要的作用。”我心情愉悦地对三妹说,“用一个 static  关键字,外加一个大括号括起来的代码被称为静态代码块。”

“就像下面这串代码。”

public class StaticBlock { static { System.out.println("静态代码块"); } public  static void main(String[] args) { System.out.println("main 方法"); }}

“静态代码块通常用来初始化一些静态变量,它会优先于 main() 方法执行。”

“来看一下程序的输出结果吧。”

静态代码块main 方法

“二哥,既然静态代码块先于 main() 方法执行,那没有 main() 方法的 Java 类能执行成功吗?”三妹的脑回路越来越令我敬佩了。

“Java 1.6 是可以的,但 Java 7 开始就无法执行了。”我胸有成竹地回答到。

public class StaticBlockNoMain { static { System.out.println("静态代码块,没有  main"); }}

“在命令行中执行 java StaticBlockNoMain 的时候,会抛出 NoClassDefFoundError 的错误。”

如何掌握static关键字

“三妹,来看下面这个例子。”

public class StaticBlockDemo { public static Listwrites = new  ArrayList<>(); static { writes.add("沉默王二"); writes.add("沉默王三");  writes.add("沉默王四"); System.out.println("第一块"); } static { writes.add("沉默王五");  writes.add("沉默王六"); System.out.println("第二块"); }}

“writes 是一个静态的 ArrayList,所以不太可能在声明的时候完成初始化,因此需要在静态代码块中完成初始化。”

“静态代码块在初始集合的时候,真的非常有用。在实际的项目开发中,通常使用静态代码块来加载配置文件到内存当中。”

04、静态内部类

“三妹啊,除了以上只写,static 还有一个不太常用的功能&mdash;&mdash;静态内部类。”

“Java 允许我们在一个类中声明一个内部类,它提供了一种令人信服的方式,允许我们只在一个地方使用一些变量,使代码更具有条理性和可读性。”

“常见的内部类有四种,成员内部类、局部内部类、匿名内部类和静态内部类,限于篇幅原因,前三种不在我们本次的讨论范围之内,以后有机会再细说。”

“来看下面这个例子。”三妹有点走神,我敲了敲她的脑袋后继续说。

public class Singleton { private Singleton() {} private static class  SingletonHolder { public static final Singleton instance = new Singleton(); }  public static Singleton getInstance() { return SingletonHolder.instance; }}

“三妹,打起精神,马上就结束了。”

“哦哦,这段代码看起来很别致啊,哥。”

“是的,三妹,这段代码在以后创建单例的时候还会见到。”

“第一次加载 Singleton 类时并不会初始化 instance,只有第一次调用 getInstance()方法时 Java 虚拟机才开始加载  SingletonHolder 并初始化 instance,这样不仅能确保线程安全,也能保证 Singleton  类的唯一性。不过,创建单例更优雅的一种方式是使用枚举,以后再讲给你听。”

“需要注意的是。第一,静态内部类不能访问外部类的所有成员变量;第二,静态内部类可以访问外部类的所有静态变量,包括私有静态变量。第三,外部类不能声明为  static。”

“三妹,你看,在 Singleton 类上加 static 后,编译器就提示错误了。”

如何掌握static关键字

“如何掌握static关键字”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/42404.html

(0)

相关推荐

  • CPU基础知识-CPU的组成 运算器、控制器、寄存器

    技术CPU基础知识-CPU的组成 运算器、控制器、寄存器 CPU基础知识-CPU的组成 运算器、控制器、寄存器1 参考资料
    计算机硬件系统—CPU(运算器和控制器)(一) https://www.jia

    礼包 2021年12月13日
  • 怎么解决MySQL中ERROR 1044 (42000)报错问题

    技术怎么解决MySQL中ERROR 1044 (42000)报错问题这篇文章主要讲解了“怎么解决MySQL中ERROR 1044 (42000)报错问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路

    攻略 2021年11月18日
  • 抖音刷评论,抖音刷评论会被限流吗?

    技术抖音刷评论,抖音刷评论会被限流吗?抖音运营目前已经进入了新的发展阶段,抖音用户逐渐多了起来,同时抖音上的管理也越来越严格,小伙伴在刷粉的时候会是担心自己的账号会不会被限流,今天我们就来了解以下抖音刷赞,抖音刷评论。

    测评 2021年11月10日
  • 如何在Java代码中去掉烦人的“!=null”

    技术如何在Java代码中去掉烦人的“!=null”本篇文章给大家分享的是有关如何在Java代码中去掉烦人的“!=null”,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一

    攻略 2021年12月2日
  • jquery如何清除兄弟元素

    技术jquery如何清除兄弟元素这篇文章主要介绍“jquery如何清除兄弟元素”,在日常操作中,相信很多人在jquery如何清除兄弟元素问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”jqu

    攻略 2021年11月19日
  • Redis与数据库数据一致性的示例分析

    技术Redis与数据库数据一致性的示例分析这期内容当中小编将会给大家带来有关Redis与数据库数据一致性的示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 可能谈到保持R

    攻略 2021年12月1日