从零开始学Java(十四)详解Java中的static关键字(下)

接上篇Java-static关键字(上),今儿继续写完,这篇文章主要内容如下:

Java static静态代码块

静态代码块的语法格式是这样的:

类{//静态代码块static{java语句;}}

静态代码块在类加载时执行,并且只执行一次。开发中使用不多,但离了它有的时候还真是没法写代码。

静态代码块实际上是java语言为程序员准备的一个特殊的时刻,这个时刻就是类加载时刻,如果你想在类加载的时候执行一段代码,那么这段代码就有的放矢了。

例如我们要在类加载的时候解析某个文件,并且要求该文件只解析一次,那么此时就可以把解析该文件的代码写到静态代码块当中了。

我们来测试一下静态代码块:

public class StaticTest01 {//静态代码块static{System.out.println(2);}//静态代码块static{System.out.println(1);}//main方法public static void main(String[] args) {System.out.println("main execute!");}//静态代码块static{System.out.println(0);}}

运行结果如下图所示:

图1:静态代码块运行结果

通过以上的测试可以得知一个类当中可以编写多个静态代码块(尽管大部分情况下只编写一个),并且静态代码块遵循自上而下的顺序依次执行,所以有的时候放在类体当中的代码是有执行顺序的(大部分情况下类体当中的代码没有顺序要求,方法体当中的代码是有顺序要求的,方法体当中的代码必须遵守自上而下的顺序依次逐行执行),另外静态代码块当中的代码在main方法执行之前执行,这是因为静态代码块在类加载时执行,并且只执行一次。

再来看一下以下代码:

public class StaticTest02 {int i = 100;static{System.out.println(i);}}

编译结果如下图所示:

图2:静态代码块中访问实例变量编译报错

为什么编译报错呢?

那是因为i变量是实例变量,实例变量必须先创建对象才能访问,静态代码块在类加载时执行,这个时候对象还没有创建呢,所以i变量在这里是不能这样访问的。可以考虑在i变量前添加static,这样i变量就变成静态变量了,静态变量访问时不需要创建对象,直接通过“类”即可访问,例如以下代码:

public class StaticTest02 {static int i = 100;static{System.out.println("静态变量i = " + i);}public static void main(String[] args) {}}

运行结果如下图所示:

图3:静态代码块中访问静态变量

代码修改为这样呢?

public class StaticTest02 {static{System.out.println("静态变量i = " + i);}static int i = 100;}

编译报错了,请看下图:

图4:编译报错信息

通过测试,可以看到有的时候类体当中的代码也是有顺序要求的(类体当中定义两个独立的方法,这两个方法是没有先后顺序要求的),静态代码块在类加载时执行,静态变量在类加载时初始化,它们在同一时间发生,所以必然会有顺序要求,如果在静态代码块中要访问i变量,那么i变量必须放到静态代码块之前。

Java static静态方法

方法在什么情况下会声明为静态的呢?方法实际上描述的是行为动作,我认为当某个动作在触发的时候需要对象的参与,这个方法应该定义为实例方法,例如:每个玩篮球的人都会打篮球,但是你打篮球和科比打篮球最终的效果是不一样的,显然打篮球这个动作存在对象差异化,该方法应该定义为实例方法。

再如:每个高中生都有考试的行为,但是你考试和学霸考试最终的结果是不一样的,一个上了“家里蹲大学”,一个上了“清华大学”,显然这个动作也是需要对象参与才能完成的,所以考试这个方法应该定义为实例方法。

以上描述是从设计思想角度出发来进行选择,其实也可以从代码的角度来进行判断,当方法体中需要直接访问当前对象的实例变量或者实例方法的时候,该方法必须定义为实例方法,因为只有实例方法中才有this,静态方法中不存在this。

请看代码:

public class Customer {String name;public Customer(String name){this.name = name;}public void shopping(){//直接访问当前对象的nameSystem.out.println(name + "正在选购商品!");//继续让当前对象去支付pay();}public void pay(){System.out.println(name + "正在支付!");}}
public class CustomerTest {public static void main(String[] args) {Customer jack = new Customer("jack");jack.shopping();Customer rose = new Customer("rose");rose.shopping();}}

运行结果如下图所示:

图5:运行结果

在以上的代码中,不同的客户购物,最终的效果都不同,另外在shopping()方法中访问了当前对象的实例变量name,以及调用了实例方法pay(),所以shopping()方法不能定义为静态方法,必须声明为实例方法。

另外,在实际的开发中,“工具类”当中的方法一般定义为静态方法,因为工具类就是为了方便大家的使用,将方法定义为静态方法,比较方便调用,不需要创建对象,直接使用类名就可以访问。

请看以下工具类,为了简化“System.out.println();”代码而编写的工具类:

public class U {public static void p(int data){System.out.println(data);}public static void p(long data){System.out.println(data);}public static void p(float data){System.out.println(data);}public static void p(double data){System.out.println(data);}public static void p(boolean data){System.out.println(data);}public static void p(char data){System.out.println(data);}public static void p(String data){System.out.println(data);}}

运行结果如下图所示:

图6:测试工具类

(0)

相关推荐

  • 一个HelloWorld,居然和面试官聊了半小时!

    这位小伙伴入行搞java开发,入坑三年不到.最近,私下跟我说,自己在团队没有存在感,决定骑马找驴. 真的,面试多了,自然也会遇到一些奇葩的面试官(不按套路出牌). 背景 他就遇到这么以为奇葩的面试官, ...

  • Java基础之三个修饰符

    三个关键字 抽象的(abstract) 静态(static) 最终的(final) 一.抽象 1.1 什么是抽象 似是而非的,像却又不是:具备某种对象的特征,但不完整. 二. 抽象的(abstract ...

  • java面向对象高级

    目录 1.类变量(静态类变量) 2.静态方法 3.Main()方法 4.代码块 5.单例模式 6.抽象类 6.1.抽象类的介绍 6.2.抽象类的特点 6.3.多态在抽象类的体现 6.4.抽象类体现了模 ...

  • 从零开始学Java(十四)详解Java中的static关键字(上)

    ✔上一篇Java零基础系列文章我们说到了Java种this关键字的使用,今天继续来说说Java中的static关键字,篇幅较多,分为上下两篇更新,这篇文章主要内容: Java中static关键字 Ja ...

  • 从零开始学Java(九)详解Java中的方法

    方法 1.什么是方法,有什么用? (可以先看一下一个程序如果没有方法,会出现什么问题?) 方法(英语单词:method)是可以完成某个特定功能的并且可以被重复利用的代码片段. 方法的出现,让代码具有了 ...

  • 详解JAVA面向对象的设计模式 (四)、外观模式

    外观模式 Facade 外观模式内容相对简单,就不写新的例子了.本篇文章摘录自 http://c.biancheng.net/view/1369.html 外观模式的定义与特点 外观(Facade)模 ...

  • 春节在家也能学二十四式太极拳 全套详解

    推荐学习:二十四式太极剑剑谱

  • 在家也能学二十四式太极拳,全套细节详解

    在家也能学二十四式太极拳,全套细节详解

  • 清娟盲派四柱八字十神详解及其用法

    清娟盲派四柱八字十神详解及其用法

  • 3W 字详解 Java 集合

    开源前哨 93篇原创内容 公众号 数据结构作为每一个开发者不可回避的问题,而 Java 对于不同的数据结构提供了非常成熟的实现,这一个又一个实现既是面试中的难点,也是工作中必不可少的工具,在此,笔者经 ...

  • 八字十神详解大全 四柱八字十神的功能与特征

    在中国古代取名有许多步骤,一个名字又分为名和字.一个人的名字通常是由家族里的长辈所取的.富含了很多的意义.在现代取名已经没有当时那么讲究,却也含有许多的知识.一个名字里面可能包含着这一个人未来的运势. ...

  • 四柱八字十神详解

    八字预测学的核心就是十神的象义和十神之间的关系,十神由于天干地支的各种复杂的作用关系上更上一层的演变过程.假如:印星是克食伤,这种组合为大败:但是干支相合的关系就会形成贵格.这些就是十神在四柱干支的关 ...