每日一练6:java关键字static和final详解
在上一篇文章中介绍了java类的访问修饰符public、protected、default、private,本文将重点介绍static和final关键字。
一、static关键字
为了全面分析java static关键字,我们来看看static关键字可以用在哪些地方。
- 修饰成员变量和方法。
static可以修饰类中的成员变量和方法,被static修饰的成员变量是静态成员变量,只能被静态方法所访问。被static修饰方法称为静态方法,能被同一类中不同的静态访问。如果静态成员变量和静态方法是用public修饰的,则该成员变量和方法是属于类的,即使没有定义该类的变量,通过类名加成员变量和方法的形式也可以访问到该成员变量和方法。举例说明如下:如下图1中,类Parent中有静态成员变量age和height,其中age是private,height是public。静态成员变量和方法通过 “类名.方法“或“类名.成员变量“方式访问,如图2所示,由于静态成员变量和方法是属于类的,即使没有实例化对象,仍然可以访问到静态成员变量和方法。
图1 具有静态成员变量和静态方法的Parent类。 图2 静态成员变量和方法通过“类名.方法“或“类名.成员变量“方式访问
2.静态代码块
在类加载的时候,静态代码块只会执行一次。如图3所示,Parent类中有静态代码块
图3 Parent类中的静态代码块
图4 实例化多个Parent的对象
图5实例化多个Parent的对象,静态代码块只执行了一次。
3.静态导入包
在图6中Utils中包含static方法,因此在要用Utils类中方法的类中只需通过import static 方法就可以导入Utils中的静态方法。如图7所示:
图6 包含static方法Utils类
图7中调用Utils类中的方法
在图7中调用Utils类中的静态方法直接写方法名就可以调用,不需要再用Utils.f1()和Utils.f2()的方式来调用静态方法了。
4.静态内部类
静态内部类是在类的内部再声明一个静态的类,静态内部类有两个主要作用:其一是方便内部类访问外部类的属性和方法,达到封装的目的;其二是静态内部类这个类本身只会由声明该内部类的外部类使用,达到内部类除外部类以外其他类不能使用的目的。如下图8所示:
图8包含静态内部类的类
图8中通过showAge()方法访问外部类的静态成员变量age,但是静态内部类不能访问外部类非静态成员变量height,如图8中showWeight()方法中是不能使用height成员变量的。
图9定义内部类对象并调用内部类的方法
二、final关键字
final关键字的使用场景主要有以下几种:
1.修饰类
被final关键字修饰的类,称为不可变类,不可变类不能被继承。在JDK中String类就是不可变类。查看JDK String源码如下图10所示
图10 String是不可变类
2.修饰成员变量
当final关键字修饰成员变量时,具有以下几个含义:
(1)表示该成员变量在声明的地方必须进行赋值,而且赋值后不能修改。如图11中,age被final修饰,那么age属性必须在构造方法中初始化。
图11 final成员变量必须初始化
(2)该成员变量是基本数据类型时,则表示成员变量的值不能修改。
(3)该成员变量是引用数据类型时,则表示则说明这个引用的地址的值不能修改,但引用里的内容可以修改。
图12被final关键字修饰的引用数据类型,不能指向别的parent对象了
3.修饰方法
修饰方法时,该方法不能被重写。表明这个类的设计者不想让其他开发人员重写该方法。对于被final修饰的方法,要么按原类的设计者设计的方法去使用。要么开发者可以另辟蹊径。如图13所示,Parent类增加被final修饰的f1()方法,在子类Child中不能重写该方法,如图14所示。
图13 Parent类增加被final修饰的f1()方法
图14不能重写父类中被final修饰过的方法f1()
4.和static结合在一起使用
一般的大型应用程序中,都有一些全局常量。final和static结合在一起就可以实现全局常量的目的。
图15应用程序全局常量示例
下一篇文章中我们将重点介绍String类
感谢阅读,动一动您的手指,分享给身边的朋友吧!谢谢!
长按识别二维码关注本文公众号