JAVA从入门到精通之Java static关键字以及Java静态变量和静态方法
龚超 2018-06-11 来源 : 阅读 1086 评论 0

摘要:在JAVA从入门到精通的学习中,本文主要向大家介绍了Java static关键字以及Java静态变量和静态方法,通过具体的实例让大家了解,希望大家在JAVA从入门到精通的路上走的更远。

在JAVA从入门到精通的学习中,本文主要向大家介绍了Java static关键字以及Java静态变量和静态方法,通过具体的实例让大家了解,希望大家在JAVA从入门到精通的路上走的更远。

static 修饰符能够与变量、方法一起使用,表示是“静态”的。
静态变量和静态方法能够通过类名来访问,不需要创建一个类的对象来访问该类的静态成员,所以static修饰的成员又称作类变量和类方法。静态变量与实例变量不同,实例变量总是通过对象来访问,因为它们的值在对象和对象之间有所不同。

请看下面的例子:

1. public class Demo {
2.     static int i = 10;
3.     int j;
4.
5.     Demo() {
6.         this.j = 20;
7.     }
8.
9.     public static void main(String[] args) {
10.         System.out.println("类变量 i=" + Demo.i);
11.         Demo obj = new Demo();
12.         System.out.println("实例变量 j=" + obj.j);
13.     }
14. }

运行结果:
类变量 i=10
实例变量 j=20

static 的内存分配

静态变量属于类,不属于任何独立的对象,所以无需创建类的实例就可以访问静态变量。之所以会产生这样的结果,是因为编译器只为整个类创建了一个静态变量的副本,也就是只分配一个内存空间,虽然有多个实例,但这些实例共享该内存。实例变量则不同,每创建一个对象,都会分配一次内存空间,不同变量的内存相互独立,互不影响,改变 a 对象的实例变量不会影响 b 对象。

请看下面的代码:

1. public class Demo {
2.     static int i;
3.     int j;
4.
5.     public static void main(String[] args) {
6.         Demo obj1 = new Demo();
7.         obj1.i = 10;
8.         obj1.j = 20;
9.        
10.         Demo obj2 = new Demo();
11.        
12.         System.out.println("obj1.i=" + obj1.i + ", obj1.j=" + obj1.j);
13.         System.out.println("obj2.i=" + obj2.i + ", obj2.j=" + obj2.j);
14.     }
15. }

运行结果:
obj1.i=10, obj1.j=20
obj2.i=10, obj2.j=0

注意:静态变量虽然也可以通过对象来访问,但是不被提倡,编译器也会产生警告。

上面的代码中,i 是静态变量,通过 obj1 改变 i 的值,会影响到 obj2;j 是实例变量,通过 obj1 改变 j 的值,不会影响到 obj2。这是因为 obj1.i 和 obj2.i 指向同一个内存空间,而 obj1.j 和 obj2.j 指向不同的内存空间,请看下图:


file:///C:\Users\Lx\AppData\Local\Temp\ksohtml\wps12FA.tmp.jpg
图1  静态变量内存分配


注意:static 的变量是在类装载的时候就会被初始化。也就是说,只要类被装载,不管你是否使用了这个static 变量,它都会被初始化。

小结:类变量(class variables)用关键字 static 修饰,在类加载的时候,分配类变量的内存,以后再生成类的实例对象时,将共享这块内存(类变量),任何一个对象对类变量的修改,都会影响其它对象。外部有两种访问方式:通过对象来访问或通过类名来访问。

静态方法

静态方法是一种不能向对象实施操作的方法。例如,Math 类的 pow() 方法就是一个静态方法,语法为 Math.pow(x, a),用来计算 x 的 a 次幂,在使用时无需创建任何 Math 对象。

因为静态方法不能操作对象,所以不能在静态方法中访问实例变量,只能访问自身类的静态变量。

以下情形可以使用静态方法:

· 一个方法不需要访问对象状态,其所需参数都是通过显式参数提供(例如 Math.pow())。

· 一个方法只需要访问类的静态变量。


读者肯定注意到,main() 也是一个静态方法,不对任何对象进行操作。实际上,在程序启动时还没有任何对象,main() 方法是程序的入口,将被执行并创建程序所需的对象。

关于静态变量和静态方法的总结:

· 一个类的静态方法只能访问静态变量;

· 一个类的静态方法不能够直接调用非静态方法;

· 如访问控制权限允许,静态变量和静态方法也可以通过对象来访问,但是不被推荐;

· 静态方法中不存在当前对象,因而不能使用 this,当然也不能使用 super;

· 静态方法不能被非静态方法覆盖;

· 构造方法不允许声明为 static 的;

· 局部变量不能使用static修饰。


静态方法举例:

1. public class Demo {
2.     static int sum(int x, int y){
3.         return x + y;
4.     }
5.
6.     public static void main(String[] args) {
7.         int sum = Demo.sum(10, 10);
8.         System.out.println("10+10=" + sum);
9.     }
10. }

运行结果:
10+10=20

static 方法不需它所属的类的任何实例就会被调用,因此没有 this 值,不能访问实例变量,否则会引起编译错误。

注意:实例变量只能通过对象来访问,不能通过类访问。

静态初始器(静态块)

块是由大括号包围的一段代码。静态初始器(Static Initializer)是一个存在于类中、方法外面的静态块。静态初始器仅仅在类装载的时候(第一次使用类的时候)执行一次,往往用来初始化静态变量。

示例代码:

1. public class Demo {
2.     public static int i;
3.     static{
4.         i = 10;
5.         System.out.println("Now in static block.");
6.     }
7.     public void test() {
8.         System.out.println("test method: i=" + i);
9.     }
10.
11.     public static void main(String[] args) {
12.         System.out.println("Demo.i=" + Demo.i);
13.         new Demo().test();
14.     }
15. }

运行结果是:
Now in static block.
Demo.i=10
test method: i=10

静态导入

静态导入是 Java 5 的新增特性,用来导入类的静态变量和静态方法。

一般我们导入类都这样写:

1. import packageName.className;  // 导入某个特定的类

1. import packageName.*;  // 导入包中的所有类


而静态导入可以这样写:

1. import static packageName.className.methonName;  // 导入某个特定的静态方法

1. import static packageName.className.*;  // 导入类中的所有静态成员


导入后,可以在当前类中直接用方法名调用静态方法,不必再用 className.methodName 来访问。

对于使用频繁的静态变量和静态方法,可以将其静态导入。静态导入的好处是可以简化一些操作,例如输出语句System.out.println(); 中的 out 就是 System 类的静态变量,可以通过 import static java.lang.System.*; 将其导入,下次直接调用 out.println() 就可以了。

请看下面的代码:

1. import static java.lang.System.*;
2. import static java.lang.Math.random;
3. public class Demo {
4.     public static void main(String[] args) {
5.         out.println("产生的一个随机数:" + random());
6.     }
7. }

运行结果:

产生的一个随机数:0.05800891549018705

以上就是职坐标整理发布关于JAVA的介绍,先祝大家应该对它有了一定的了解吧,希望这篇文章对大家有一定的帮助,了解更多详情请关注职坐标编程语言JAVA频道!

本文由 @职坐标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论
本文作者 联系TA

擅长针对企业软件开发的产品设计及开发的细节与流程设计课程内容。座右铭:大道至简!

  • 370
    文章
  • 45114
    人气
  • 83%
    受欢迎度

已有24人表明态度,83%喜欢该老师!

进入TA的空间
求职秘籍 直通车
  • 资料领取 资料领取 资料领取
  • 答疑解惑 答疑解惑 答疑解惑
  • 技术交流 技术交流 技术交流
  • 职业测评 职业测评 职业测评
  • 面试技巧 面试技巧 面试技巧
  • 高薪秘笈 高薪秘笈 高薪秘笈
TA的其他文章 更多>>
WEB前端必须会的基本知识题目
经验技巧 93% 的用户喜欢
Java语言中四种遍历List的方法总结(推荐)
经验技巧 91% 的用户喜欢
Java语言之SHA-256加密的两种实现方法详解
经验技巧 75% 的用户喜欢
java语言实现把两个有序数组合并到一个数组的实例
经验技巧 75% 的用户喜欢
通过Java语言代码来创建view的方法
经验技巧 80% 的用户喜欢
其他海同师资 更多>>
吕益平
吕益平 联系TA
熟悉企业软件开发的产品设计及开发
孔庆琦
孔庆琦 联系TA
对MVC模式和三层架构有深入的研究
戴懿颢​
戴懿颢​ 联系TA
20年+嵌入式开发经验,精多语言 / 云 / 安全 / 数据库
郭自琦
郭自琦 联系TA
16年物联网经验,涉多项目,多校授课,出版书籍并研发IT教程
余承民
余承民 联系TA
8年开发+5年教学经验,指导数千名学员高薪就业
经验技巧30天热搜词 更多>>

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved