Java 中static与final使用
在java开发中,我们经常会用到static与final关键字,看过很多遍,总是会忘记,下面来总结一下
static关键字的使用
1.修饰成员变量
用static关键字修饰的变量称之为静态变量。而静态变量与非静态变量的区别主要在于:
- 静态变量:被所有的对象所共享,在内存中只存在一个副本,只在类初次加载时被初始化。
- 非静态变量:有对象所拥有,在对象创建时初始化,存在多个副本,各个对象拥有的副本互不影响。
### 2.修饰方法
static方法称为静态方法。静态方法是不依赖于任何对象就可以进行访问的,由于都不依赖任何对象,故不存在this一说。需要注意的是静态方法只能访问或调用静态变量或者静态方法,不能访问类的任何非静态成员变量和方法。但是,在非静态方法中可以访问静态成员变量与方法。
3.修饰代码块
static还有个特殊用处就是可以用来修饰代码块,static代码块可以放在类中的任何地方。并且只会在类初次被加载时,按static代码块的顺序执行一次。static代码块可以用来优化程序性能,正式因为他只会在类初次加载时,执行一次。
4.static需要注意的一些点
- 静态成员变量虽然独立于对象,但是不代表不可以通过对象去访问,所有的静态方法和静态变量都可以通过对象访问(只要访问权限足够)。
- static关键字并不会改变变量和方法的访问权限
- 在C/C++中static是可以作用域局部变量的,但是在Java中切记:static是不允许用来修饰局部变量。不要问为什么,这是Java语法的规定。
final关键字
final关键字经常用于匿名内部类,java的String类也是final修饰的,下面我们来看看final的具体用法
1.修饰类
当用final来修饰一个类时,表示这个类不会被继承。所以当我们需要制定一个不会被继承的类时,就用fianl关键字。final类中的成员变量可以根据需要是否使用final,但是注意,final类中的方法,默认都被隐式的指定为final。
在使用final修饰类的时候,要注意谨慎选择,除非这个类真的在以后不会用来继承或者出于安全的考虑,尽量不要将类设计为final类。
2.修饰方法
“使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。“ ----《java编程思想》
因此,如果只有在想明确禁止 该方法在子类中被覆盖的情况下才将方法设置为final的。即父类的final方法是不能被子类所覆盖的,也就是说子类是不能够存在和父类一模一样的方法的。
final修饰的方法表示此方法已经是“最后的、最终的”含义,亦即此方法不能被重写(可以重载多个final修饰的方法)。此处需要注意的一点是:因为重写的前提是子类可以从父类中继承此方法,如果父类中final修饰的方法同时访问控制权限为private,将会导致子类中不能直接继承到此方法,因此,此时可以在子类中定义相同的方法名和参数,此时不再产生重写与final的矛盾,而是在子类中重新定义了新的方法。(注:类的private方法会隐式地被指定为final方法。)
### 3.修饰变量
final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
final修饰一个成员变量(属性),必须要显示初始化。这里有两种初始化方式,一种是在变量声明的时候初始化;第二种方法是在声明变量的时候不赋初值,但是要在这个变量所在的类的所有的构造函数中对这个变量赋初值。
fianl关键字需要注意的问题
- 不要以为某些数据是final就可以在编译期知道其值,通过变量b我们就知道了,在这里是使用getHello()方法对其进行初始化,他要在运行期才能知道其值。如下面代码所示。
- final修饰的引用变量指向的对象内容可变,引用变量被final修饰之后,虽然不能再指向其他对象,但是它指向的对象的内容是可变的。
- 除了可以用final修饰成员变量、成员方法、类,还可以修饰参数、若某个参数被final修饰了,则代表了该参数是不可改变的
public class Test { public static void main(String[] args) { String a = "hello2"; final String b = "hello"; String d = "hello"; String c = b + 2; String e = d + 2; System.out.println((a == c)); System.out.println((a == e)); } }
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
阿里云镜像市场mysql默认密码如何修改 图文教程
问题说明 小编在阿里云上够买了云服务器,因为省事,不想依次安装Java运行环境(jdk+mysql+tomcat),之前依次在linux安装jdk,mysql,tomcat还是比较繁琐的,为了节省时间,以后都采用镜像市场里面的。 所以在镜像市场上找了免费的Java运行环境镜像:https://market.aliyun.com/products/53400005/cmjj014493.html?spm=5176.730005.productlist.d_cmjj014493.265b3524Heeo1k&innerSource=search_java 但是问题来了,安装mysql成功之后,是需要有一个默认密码的,没有默认密码,你也没有办法去修改新密码。 mysql的默认密码在哪里? 问题分析 因为镜像市场提供的是一套软件包,安装之后,肯定会在linux上某个文件上记录mysql的初始默认密码的。根据这个分析,我们去找下默认密码 问题解决 找到默认密码: 登录Linux远程服务器之后:我们发现了readme.txt文件。 vim /root/readme.txt 解释说明:利用v...
- 下一篇
java函数式编程
前言 2014年,Oracle发布了Java8新版本。这对java来说是一个里程碑式的版本。他最主要的改进就是增加了函数式编程的功能(为了解决java程序总是冗长的问题),或许会感到奇怪,函数式编程和并发似乎没什么关系,但是java中与并发相关的API的实现,却是以函数式编程的范式来实现的。所以为了更好的理解这些功能,需要先学习下函数式编程。 java8的函数式编程一些特点 函数作为一等公民 我理解的,一句话来总结就是函数可以作为另一个函数的参数或者返回值吧!。如下面一段Javascript代码: function f1(){ var n=1; function f2(){ alert(n); } return f2; } var result= f1(); result();//1 上述代码f1返回了f2并赋值给了result,此时result就是一个函数,指向f2,调用result就会打印n的值 无副作用 函数的副作用指的是函数除了返回值外,还修改了函数外部的状态,不如修改了一个全局变量。可以想象,这样当系统出现故障时,我们很难判断问题是由哪一个函数引起的,对调试和追踪是没有好处的...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- 设置Eclipse缩进为4个空格,增强代码规范
- Mario游戏-低调大师作品
- MySQL8.0.19开启GTID主从同步CentOS8
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS8编译安装MySQL8.0.19
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS关闭SELinux安全模块