Java基础之final、static关键字
一、前言
关于这两个关键字,应该是在开发工作中比较常见的,使用频率上来说也比较高。接口中、常量、静态方法等等。但是,使用频繁却不代表一定是能够清晰明白的了解,能说出个子丑演卯来。下面,对这两个关键字的常见用法做点总结记录,方便之后的回顾以及突击知识点。
二、关键字 final
final,一如字面意思 “最终的”,大体在 Java 中表示 “不可变的”。可用来修饰类、方法、方法参数以及变量。
1、修饰类
final 在修饰类的时候,代表的是此类不能被继承。也就是说如果一个类确定不会被继承使用,则可以设计成 final类型的。典型的例子就是 String 类。
2、修饰方法
final 修饰的方法,能被继承,但是不能重写。可以重载。
3、修饰方法参数
final 在修饰方法参数的时候,表示的是在执行方法的内部,不能够去改变参数的值。但是如果是引用对象,是可以改变应用对象的属性值。
4、修饰变量
final 在修饰变量,代表的是不可变,也即是常说的 “常量”。 final 在修饰的时候,允许一次赋值,之后在生命周期类,不允许对其进行修改。
修饰变量存在两种情况:基本类型的数据 和 对象数据。在修饰基本类型数据的时候,值是不可变的。在修饰对象数据的是,对象的引用是不可改变的,但是,可以修改对象内部的属性值。
final 修饰的变量必须在使用前进行初始化,一种方式是在声明的时候就给出默认值。还有一种就是通过构造方法去设置。
5、代码示例
- package com.cfang;
- import java.util.Calendar;
- import lombok.Data;
- import lombok.extern.slf4j.Slf4j;
- @Slf4j
- public class T3 {
- public static void main(String[] args) {
- // -- 修饰变量
- final int b = ;
- /**
- * 编译报错:The final local variable b cannot be assigned. It must be blank and not using a compound assignment
- */
- // b = 2;
- // -- 修饰方法参数
- DemoCls cls = new DemoCls();
- cls.setAge();
- log.info("democls age : {}", cls.getAge());
- int a = ;
- sayHello(a, cls);
- log.info("after call sayHello, democls age : {}", cls.getAge());
- }
- private static void sayHello(final int a, final DemoCls cls) {
- /**
- * 编译报错:The final local variable a cannot be assigned. It must be blank and not using a compound assignment
- */
- // a = 11;
- // cls = new DemoCls();
- cls.setAge();
- }
- }
- @Data
- class DemoCls{
- private int age;
- }
- // -- 修饰方法
- @Slf4j
- class Person {
- public final void saySth() {
- log.info("i am person");
- }
- }
- @Slf4j
- class Male extends Person{
- /**
- * 编译出错 : Cannot override the final method from Person
- * 修饰的方法不能够被重写
- */
- // public final void saySth() {
- // log.info("i am male");
- // }
- public final void saySth(String msg) {
- log.info("i am male");
- }
- }
其中,修饰方法参数,如果是引用对象,是可以改变对象的属性值,这一点也很好理解:cls 是引用变量,final 修饰引用变量,只是限定了此引用变量 cls 的引用不能改变,而实际引用的对象的本身的值是可以进行修改的。文字语言组织可能不是很清晰,如下图所示,一目了然的就知道说要表述的意思了。
三、关键字 static
static,静态的。在 Java 中,static 通常可被用于修饰 变量、方法以及代码块。
1、修饰变量
static 修饰的变量,叫做静态变量。static 变量被所有类对象共享,在内存中仅一份,随着类的初始化而被加载。与之对应的非静态变量,是属于每个实例对象本身,内存中存在多份,相互间不影响。
2、修饰方法
static 修饰的方法,叫做静态方法。调用静态方法,不依赖于实例对象就可以进行访问,所以,静态方法是没有 this的。由于此特性以及非静态方法依赖于实例对象调用,所以静态方法中是不能够直接使用非静态的成员属性和方法。与之相反的是,非静态方法是可以直接访问使用静态成员变量和方法。同样的,静态方法也是没有 super 的。可以一句话总结下:由于 static 和具体的实例对象无关,而 this、super和具体的实例对象息息相关,所以,static 和 this、super 势如水火,一如白天与黑夜。
3、修饰代码块
static 修饰代码块,在类初始化加载的时候,会按照 static 块的顺序进行加载,并且,生命周期内,只加载一次。基于此特性,可以设计优化程序的性能,一些只需要一次性初始化加载的内容,就可以放在 static 块中进行。
4、代码示例
- package com.cfang;
- import lombok.extern.slf4j.Slf4j;
- @Slf4j
- public class T4 {
- private static int a;
- private static int b;
- private static int c;
- static {
- log.info("init value a");
- a = ;
- }
- {
- /**
- * 普通代码块,依赖于实例对象
- */
- log.info("init value c");
- c = ;
- }
- public static void main(String[] args) {
- // -- 静态方法调用非静态
- /**
- * 不可直接访问
- */
- // sayHello1();
- new T4().sayHello1();
- // -- 静态方法直接调用
- sayHello();
- // -- 静态代码块初始化资源
- log.info("value a : {}", a);
- log.info("value b : {}", b);
- log.info("value c : {}", c);
- }
- private static void sayHello() {
- log.info("say hello");
- }
- private void sayHello1() {
- log.info("say hello1");
- // -- 非静态方法直接调用
- sayHello();
- }
- static {
- log.info("init value b");
- b = ;
- }
- }
5、static 常见误区
- package com.cfang;
- import lombok.Data;
- import lombok.extern.slf4j.Slf4j;
- @Slf4j
- public class T5 {
- private static int a = ;
- public static void main(String[] args) {
- new T5().printVal();
- //-- The field DemoCls01.b is not visible
- DemoCls01.b;
- }
- private void printVal() {
- int a = ;
- log.info("value a : {}", this.a);
- }
- }
- @Data
- class DemoCls01{
- private static int b;
- }
5.1、static 的 this
上述代码中,最终运行 printVal 方法,输出的结果是 :value a : 10 。 其实这也很好理解: this 指代的当前对象,而通过 new T5().printVal() 调用的话,this 指代的就是当前新创建的实例对象,static 修饰的变量本身是被所有类对象所共享的,而 printVal 方法中 a 属于局部变量,跟 this 实例对象并没有关联。所以,输出的就是 10。
5.2、static 与 可见性
static 并不能改变变量或者方法的可见性。上述代码中,main 方法中,DemoCls01.b 会编译报错。
5.3、static 与 局部变量
Java规范中,明确说明了 :static 关键字不可修饰局部变量。
四、总结
final 和 static ,联合使用修饰属性表示一旦给值,就不可修改,并且可以通过类名访问;修饰方法,表示该方法不能重写,可以在不new对象的情况下调用。
突然想到,接口 interface 中,成员变量的默认修饰符为 public static final,方法的默认修饰符 public abstract 。
Java基础之final、static关键字的更多相关文章
- java基础学习总结——static关键字
一.static关键字
- Java基础语法 - 面向对象 - static 关键字
使用static关键字修饰的变量.常量和方法分别被称作静态变量.静态常量和静态方法,也被称作类的静态成员 静态变量 使用static修饰过的类变量称为静态变量 该变量需要使用类名.变量名进行调用,不能 ...
- java基础之final/static/static final
一.final 1.final修饰变量(常量) final修饰的成员变量表示常量,一旦给定初值既无法改变 2.final方法 final修饰方法,表示该方法不能被子类重写 好处:比非final方法要快 ...
- “全栈2019”Java第四十一章:static关键字
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- Java基础(五) final关键字浅析
前面在讲解String时提到了final关键字,本文将对final关键字进行解析. static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提 ...
- 【Java基础】final关键字总结
Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使 ...
- Java基础(三)-final关键字分析
今天来谈谈final关键字的作用, 虽然有很多博文关于final进行了很深的研究,但还是要去记录下谈谈自己的见解加深下印象.下面直接进入主题: 一.final关键字的作用 1.被final修饰的类不能 ...
- Java基础之final和abstract关键字
final final在Java中是一个保留的关键字,可以声明成员变量.方法.类以及本地变量.一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变量再次初始化的话,编 ...
- Java final static关键字
Java中的final关键字 使用 final 关键字做标识有 “最终的” 含义. final 可以修饰 类.方法.属性.变量 final 修饰类: 则该类不允许被继承 final 修饰方法:则该方法 ...
随机推荐
- SpringBoot打包部署简单说明
SpringBoot项目打包部署 一.jar包方式 这种使用SpringBoot内嵌的Tomcat进行部署 打包方式默认jar,所以下面加也行,不加也行 <packaging>war< ...
- 【JVM从小白学成大佬】5.垃圾收集器及内存分配策略
前面介绍了垃圾回收算法,接下来我们介绍垃圾收集器和内存分配的策略.有没有一种牛逼的收集器像银弹一样适配所有场景?很明显,不可能有,不然我也没必要单独搞一篇文章来介绍垃圾收集器了.熟悉不同收集器的优缺点 ...
- 一键部署 Spring Boot 到远程 Docker 容器,就是这么秀!
不知道各位小伙伴在生产环境都是怎么部署 Spring Boot 的,打成 jar 直接一键运行?打成 war 扔到 Tomcat 容器中运行?不过据松哥了解,容器化部署应该是目前的主流方案. 不同于传 ...
- 水果机抽奖(CocosCreator)
推荐阅读: 我的CSDN 我的博客园 QQ群:704621321 一.前言 在前面给大家分享了大转盘的抽奖方式,这是现在游戏使用较多的一种抽奖方式,今天给大家介绍另一抽奖方式--水果 ...
- Oracle在VMware虚拟机安装的配置
我是在VMware虚拟机上安装的Oracle , 我只说说我踩过的几个坑吧. VMware的虚拟网络编辑器 仅主机模式相当于在你的主机和虚拟机之间建立了一个局域网,里面只有你的主机和虚拟机 可以通过D ...
- kafka消息分发策略分析
当我们使用kafka向指定Topic发送消息时,如果该Topic具有多个partition,无论消费者有多少,最终都会保证一个partition内的消息只会被一个Consumer group中的一个C ...
- selenium webdriver (python)第三版.pdf
转载自:http://download.csdn.net/detail/waiwaijsj/7214035 是原作者根据自己的经验整理的,很实用.
- ABC133F - Colorful Tree
ABC133FColorful Tree 题意 给定一颗边有颜色和权值的树,多次询问,每次询问,首先更改颜色为x的边的权值为y,然后输出u到v的距离. 数据都是1e5量级的. 思路 我自己一开始用树链 ...
- POJ 1797-Heavy Transportation-dijkstra小变形和POJ2253类似
传送门:http://poj.org/problem?id=1797 题意: 在起点和终点间找到一条路,使得经过的边的最小值是最大的: 和POJ2253类似,传送门:http://www.cnblog ...
- 2017ACM总结
首先对自己表示强烈的谴责, 这个时间应该是打cf的时间, 没有想到我又秀到了自己, 放弃了CF, 23333, 菜鸡wxk. 高中刚毕业的时候,听大学生们跪求老师不要给挂科,当时想的是,哇上了大学就不 ...