详解 final 和 static
在我们上一篇博文中提到了 fianl 这个关键字,对于这个关键字,本人在初学时也耗费了极大地心血,甚至和师兄进行了激烈的讨论,并且,在我们讨论、尝试 以及 翻阅各种资料,最终得出了合适、易懂的解释。
现在,本人来介绍一下final这个关键字:
final :
首先,本人来解答一下同学们现在心中可能有的疑惑——为什么会有final呢?
由于继承中有一个覆盖(方法重写)的现象(相关知识点在本人《详解 方法的覆盖 —— toString() 与 equals()的覆盖》)中进行详细讲解,而有时候我们不想让子类去“覆盖”父类的方法.这对这种情况java就给我们提供了一个关键字: final
那么,现在本人来介绍下使用这个关键字修饰的特点吧:
final修饰特点:
修饰类: 被修饰类不能被继承
修饰方法: 被修饰的方法不能被重写
修饰变量:
- 仅在 编译时 被赋初值,并在之后永不改变 的 常量;
- 在定义这种常量的时候,就必须对其赋值。因为fianl类型的变量,在构造方法时并不会被赋初值,所以我们在定义final类型变量时,要手动给其赋初值,否则会不能进行编译;
- 对于对象的引用,fianl 关键字使得引用恒定不变。一旦引用被初始化指向一个对象,就无法再把它改为指向另一个对象。
但是,对象本身是可以被修改的,JAVA并没有提供使任何对象恒定不变的途径。
(这一限制同样适用数组,因为数组也是对象)
对于“引用”这一概念,可以理解为对象的“指针”,但是是有所差异的,同学们不用着急,在本人之后的博文中会对这个知识点进行使用和讲解。
而我们在学习SE的阶段一般都是用final来修饰变量,在我们使用final关键字来修饰变量时,它的功能相当于我们在C语言中的“宏”,主要目的是 避免出现“神仙代码”,使代码逻辑清晰
那么,现在,本人来介绍一下 static关键字吧。
static:
关于这个关键字,我们并不陌生,因为它在这里的 名称 和在C语言中一样,用static关键字修的成员 被称为 静态成员。
现在,本人来介绍下 static关键字的特点:
- 随着类的加载而加载:
静态成员 在 JVM对类加载时,就被申请了空间。这也就是说,在一个类还没有被实例化的对象前,就已经申请好了静态成员的空间了; - 被类的所有对象共享:
静态成员不是 “私有财产” ,同一个静态成员在所有该类的对象中是同一个空间; - 静态方法不能引用 非静态成员 和 非静态方法。
但是,非静态方法可以调用静态成员 和 静态方法; - 可以通过类名调用:
静态成员 和 静态方法 一般通过如下方式被调用:
(1)类名称.静态成员;
(2)类名称.静态方法(); - 静态方法中 不允许出现 this:
这是由于:
静态是随着类的加载而加载,this是随着对象的创建而存在。
静态比对象先存在。故我们不能在静态方法中出现this
那么,有static关键字修饰的变量的特点就讲解完了,现在本人来讲解下 局部变量、类的非静态成员 和 类的静态成员 之间的区别吧:
静态变量和成员变量的区别:
- 内存中位置不同:
静态变量 存储于 方法区的静态区
成员变量 存储于 堆内存- 所属不同:
静态变量 属于 类,所以也称为类变量
成员变量 属于 对象,所以也称为实例变量(对象变量)- 内存出现时间不同:
静态变量 随着类的加载而加载,随着类的消失而消失
成员变量 随着对象的创建而存在,随着对象的消失而消失- 调用不同:
静态变量 可以通过类名调用,也可以通过对象调用,推荐使用类名调用
成员变量 只能通过对象名调用
在最后的最后,本人来总结一下:
- final关键字保证的是 该空间的值不可更改,且只能在该类内的方法被调用;
- static关键字保证的是 该空间的值预先赋值好了,且可以在该项目下任意位置使用
详解 final 和 static的更多相关文章
- [C/C++] extern关键字详解以及与static、const区别
extern用法详解: 1. 声明外部实体 声明外部全局变量或对象,一般用于头文件中,表示在其它编译单元内定义的变量,链接时进行外部链接,如: extern int ivalue; 此时的extern ...
- 详解详解Java中static关键字和final关键字的功能
摘要:static关键字和final关键字是Java语言的核心,深入理解他们的功能非常重要. 本文分享自华为云社区<Java: static关键字与final关键字>,原文作者:唐里 . ...
- Java之static静态关键字详解|final关键字详解
前言 在Java语言中,static表示"静态"的意思,使用场景可以用来修饰成员变量和成员方法,当然也可以是静态代码块.static的主要作用在于创建独立于具体对象的域变量或者方法 ...
- java详解final、多态、抽象类、接口原理
1:final关键字(掌握) (1)是最终的意思,可以修饰类,方法,变量. (2)特点: A:它修饰的类,不能被继承. B:它修饰的方法,不能被重写. C:它修饰的变量,是一个常量. (3)面试相关: ...
- Java之Static静态修饰符详解
Java之Static静态修饰符详解 Java之Static静态修饰符详解 一.特点 1.随着类的加载而加载,随着类的消失而消失,生命周期最长 2.优先于对象存在 3.被所有类的对象共享 4.可以直接 ...
- 2020了你还不会Java8新特性?(五)收集器比较器用法详解及源码剖析
收集器用法详解与多级分组和分区 为什么在collectors类中定义一个静态内部类? static class CollectorImpl<T, A, R> implements Coll ...
- Spring IoC getBean 方法详解
前言 本篇文章主要介绍 Spring IoC 容器 getBean() 方法. 下图是一个大致的流程图: 正文 首先定义一个简单的 POJO,如下: public class User { priva ...
- java 关键字final static native详解
java 关键字native static final详解 一.final 根据程序上下文环境,Java关键字final有"这是无法改变的"或者"终态的"含义, ...
- abstract关键字、final关键字、static关键字、访问修饰符详解
abstract关键字.final关键字.static关键字.访问修饰符详解 abstract关键字: final关键字: static关键字: 访问修饰符:
随机推荐
- mycat主要参数
以下内容源于mycat官方文档,记录下来方便直接查看: mycat版本:1.6 负载均衡类型,目前的取值有 3 种:1. balance="0", 不开启读写分离机制,所有读操作都 ...
- 【笔记3-26】Python语言基础
编译型语言和解释型语言 编译型语言 C 先编译 解释型语言 Python 边执行边编译 Python的介绍 吉多·范罗苏姆 1991 解释型语言 Life is short you need Pyth ...
- Python批量修改Excel中的文件内容
import osimport xlrdfrom xlutils.copy import copydef base_dir(filename=None): return os.path.join ...
- 知识图谱与机器学习 | KG入门 -- Part1 Data Fabric
介绍 如果你在网上搜索机器学习,你会找到大约20500万个结果.确实是这样,但是要找到适合每个用例的描述或定义并不容易,然而会有一些非常棒的描述或定义.在这里,我将提出机器学习的另一种定义,重点介绍一 ...
- coding++:Spring Boot 全局事务解释及使用(二)
什么是全局事务: Spring Boot(Spring) 事务是通过 aop(aop相关术语:通知(Advice).连接点(Joinpoint).切入点(Pointcut).切面(Aspect).目标 ...
- python—nnlog日志
#when='S'每秒产生一个[D天默认 H M S]# backCount='5'## level是设置打印级别默认是debug级别(下面是四个级别可以指定打印) import nnlog lo ...
- sql 数据库操作语句 不带select
MySQL数据操作语句 1.总纲 DDL -数据定义语句** create/drop/alter ** create: 创建 drop:删除 alter:修改 DML -数据操作语句 ** inser ...
- CodeForces 506B/505D Mr. Kitayuta's Technology
Portal:http://codeforces.com/problemset/problem/506/B http://codeforces.com/problemset/problem/505/D ...
- Oracle ROWNUM用法
很多朋友应该跟我一样有个疑问,为什么rownum > 5 的时候会查不到一条数据,用rownum < 5就可以查到数据,明明查询所有的时候rownum有很多啊,小朋友,你是不是有很多问号? ...
- SpringBoot系列之RabbitMQ使用实用教程
SpringBoot系列之RabbitMQ使用实用教程 @ 目录 1. 消息队列概述 1.1 MQ的概述 1.2 MQ目的地形式 2. 消息队列实现方式 2.1 常见MQ框架 2.2 MQ实现方式 3 ...