java final static_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;

@Slf4jpublic classT3 {public static voidmain(String[] args) {//-- 修饰变量

final int b = 0;/**

* 编译报错:The final local variable b cannot be assigned. It must be blank and not using a compound assignment*/

//b = 2;//-- 修饰方法参数

DemoCls cls = newDemoCls();

cls.setAge(10);

log.info("democls age : {}", cls.getAge());int a = 10;

sayHello(a, cls);

log.info("after call sayHello, democls age : {}", cls.getAge());

}private static void sayHello(final inta, 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(11);

}

}

@DataclassDemoCls{private intage;

}//-- 修饰方法

@Slf4jclassPerson {public final voidsaySth() {

log.info("i am person");

}

}

@Slf4jclassMale extends Person{/**

* 编译出错 : Cannot override the final method from Person

* 修饰的方法不能够被重写*/

//public final void saySth() {//log.info("i am male");//}

public final voidsaySth(String msg) {

log.info("i am male");

}

}

其中,修饰方法参数,如果是引用对象,是可以改变对象的属性值,这一点也很好理解:cls 是引用变量,final 修饰引用变量,只是限定了此引用变量 cls 的引用不能改变,而实际引用的对象的本身的值是可以进行修改的。文字语言组织可能不是很清晰,如下图所示,一目了然的就知道说要表述的意思了。

67a537b41869f32490648a11acabc31f.png

三、关键字 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;

@Slf4jpublic classT4 {private static inta;private static intb;private static intc;static{

log.info("init value a");

a= 10;

}

{/**

* 普通代码块,依赖于实例对象*/log.info("init value c");

c= 12;

}public static voidmain(String[] args) {//-- 静态方法调用非静态

/**

* 不可直接访问*/

//sayHello1();

newT4().sayHello1();//-- 静态方法直接调用

sayHello();//-- 静态代码块初始化资源

log.info("value a : {}", a);

log.info("value b : {}", b);

log.info("value c : {}", c);

}private static voidsayHello() {

log.info("say hello");

}private voidsayHello1() {

log.info("say hello1");//-- 非静态方法直接调用

sayHello();

}static{

log.info("init value b");

b= 11;

}

}

5、static 常见误区

package com.cfang;

import lombok.Data;

import lombok.extern.slf4j.Slf4j;

@Slf4jpublic classT5 {private static int a = 10;public static voidmain(String[] args) {newT5().printVal();//-- The field DemoCls01.b is not visible

DemoCls01.b;

}private voidprintVal() {int a = 11;

log.info("value a : {}", this.a);

}

}

@DataclassDemoCls01{private static intb;

}

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 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532337.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java语言错误的是解释运行的_Java基础知识测试__A卷_答案

考试宣言:同学们, 考试考多少分不是我们的目的! 排在班级多少的名次也不是我们的初衷!我的考试的目的是要通过考试中的题目,检查大家在这段时间的学习中,是否已经把需要掌握的知识掌握住了,如果哪道题目你不会做,又或者做错了, 那么不用怕, 考完试后, 导师讲解的时候你要注意听…

java 持续集成工具_Jenkins-Jenkins(持续集成工具)下载 v2.249.2官方版--pc6下载站

Jenkins是一款基于java开发的持续集成工具,是一款开源软件,主要用于监控持续重复的工作,为开发者提供一个开发易用的软件平台,使软件的持续集成变成可能。。相关软件软件大小版本说明下载地址Jenkins是一款基于java开发的持续集成…

java中线程调度遵循的原则_深入理解Java多线程核心知识:跳槽面试必备

多线程相对于其他 Java 知识点来讲,有一定的学习门槛,并且了解起来比较费劲。在平时工作中如若使用不当会出现数据错乱、执行效率低(还不如单线程去运行)或者死锁程序挂掉等等问题,所以掌握了解多线程至关重要。本文从基础概念开始到最后的并…

java类构造方法成员方法练习_面向对象方法论总结 练习(一)

原标题:面向对象方法论总结 & 练习(一)学习目标1.面向对象与面向过程2.类与对象的概念3.类的定义,对象的创建和使用4.封装5.构造方法6.方法的重载内容1.面向对象与面向过程为什么会出现面向对象反分析方法?因为现实世界太复杂多变&#x…

mysql 统计查询不充电_MySql查询语句介绍,单表查询,来充电吧

mysql在网站开发中,越来越多人使用了,方便部署,方便使用。我们要掌握mysql,首先要学习查询语句。查询单个表的数据,和多个表的联合查询。下面以一些例子来先简单介绍下单表查询。操作方法01首先看下我们例子用到的数据表&#xff…

MySQL线上优化_线上MySQL千万级大表,如何优化?

前段时间应急群有客服反馈,会员管理功能无法按到店时间、到店次数、消费金额进行排序。经过排查发现是 SQL 执行效率低,并且索引效率低下。图片来自 Pexels应急问题商户反馈会员管理功能无法按到店时间、到店次数、消费金额进行排序,一直转圈…

php创建表设置编码,教您在Zend Framework里如何设置数据库编码以及怎样给数据表设定前缀!...

当我们在开发项目时..大家都会遇到一个问题就是:数据库的编码问题.当然我们不用Zend Framework做为项目开发的框架时..我们可以很快,很容易搞定这个小问题..但是当我们要使用Zend Framewok开发项目时..我们可能一时会不知道如何解决这个小问题..比如我就是这样的人..在开发这个…

python 怎么将数组转为列表_怎么将视频转为GIF动态图 表情包怎么制作

说到GIF,大家应该都不陌生了吧!尤其是在聊天中使用较多,似乎一言不合就开启了斗图模式,但是我们平时使用的GIF一般都是软件中自带的,其实自己制作也是很方便的,而且会发现很有趣,不但可以直接录…

proteus里面没有stm32怎么办_嵌入式单片机之stm32串口你懂了多少!!

stm32作为现在嵌入式物联网单片机行业中经常要用多的技术,相信大家都有所接触,今天这篇就给大家详细的分析下有关于stm32的出口,还不是很清楚的朋友要注意看看了哦,在最后还会为大家分享有些关于stm32的视频资料便于学习参考。点击…

tomcat不能解析php,tomcat不支持php怎么办

tomcat不支持php的解决办法:首先将“PHP/Java Bridge”下的相关文件复制到tomcat的lib目录下;然后修改tomcat安装目录下conf文件夹里的“web.xml”文件;最后重启tomcat即可。java开发者都知道,tomcat是用来部署java web项目的。这…

c++ dicom图像切割_【高训智造】原创专业课堂第225期--定位滑座的线切割加工

原标题:【高训智造】原创专业课堂第225期--定位滑座的线切割加工欢迎来到【高训智造】原创专业课堂第225期,本期由郭沃沛老师给大家带来线切割小课堂。定位滑座的线切割加工郭沃沛1零件图如图1所示为定位滑座零件图,其材料为45钢,…

c iostream.源码_通达信指标公式源码精准买卖主图指标公式免费分享

V0:EMA(C,5),COLOR00FF66;V1:EMA(C,10),COLOR00FF66;V2:EMA(C,15),LINETHICK2,COLORFFFFFF;V3:EMA(C,30);V4:EMA(C,60),COLOR3366FF;年线:EMA(C,90),COLORBLUE;M1:1000*V1/V4<1015 AND 1000*V1/V4>975;M2:1000*V2/V4<1020 AND 1000*V2/V4>980;M3:1000*V3/V4<101…

4am永远 鼠标按键设置_4AM称霸PCL和PEL 绝地求生与和平精英的双端冠军 | 电玩巴士...

在《绝地求生》PCL秋季赛&#xff0c;4AM高分碾压全场斩获冠军&#xff1b;在手游和平精英PEL联赛上4AM战队再度重拳出击荣获S3总冠军。在同一时间&#xff0c;4AM战队实现了端游与手游双冠王的神迹&#xff01;要说国内第一大逃杀电竞俱乐部&#xff0c;4am自认第二&#xff0…

checkA.php,php window平台模拟checkdnsrr函数检测_php

在php的系统函数中有一个checkdnsrr函数&#xff0c;该函数的作用是根据一个给定的host name(域名)或者IP地址检查它是否有DNS记录&#xff0c;目的就是检验它是否真实存在。但是该函数仅可以在linux系统下使用&#xff0c;并不支持windows平台。下面是网上搜集到的一个hack的方…

oracle临时表经常被锁_【赵强老师】Oracle数据库的存储结构

Oracle的存储结构分为&#xff1a;物理存储结构和逻辑存储结构。一、物理存储结构&#xff1a;指硬盘上存在的文件数据文件(data file)一个数据库可以由多个数据文件组成的&#xff0c;数据文件是真正存放数据库数据的。一个数据文件就是一个操作系统文件。数据库的对象(表和索…

h5 nan_手把手教你将H5游戏打包成快游戏

H5游戏可以通过快应用的web组件快速打包成快游戏&#xff0c;打包上架后的快游戏&#xff0c;只要原H5游戏的url不发生变动&#xff0c;快游戏就不需要做更新&#xff0c;维护工作量小。使用快应用IDE&#xff0c;打包快游戏的操作很简单。访问官网安装开发工具&#xff0c;在P…

平板电脑有什么用_除了盖泡面,平板电脑没什么用了

平板电脑似乎变成一个鸡肋&#xff0c;逐渐没有多少人买了。就算拥有&#xff0c;抱在怀里把玩的机会少了&#xff0c;躺在角落吃灰的时候多了。曾经&#xff0c;没有人能拒绝平板电脑的诱惑。有了平板&#xff0c;你仿佛跻身上流社会。不经意间拿出时的从容&#xff0c;打开皮…

java程序面向对象show,20165309 实验二 Java面向对象程序设计

2017-2018-2 20165309实验二《Java面向对象程序设计》实验报告一、实验内容1. 初步掌握单元测试和TDD2. 理解并掌握面向对象三要素&#xff1a;封装、继承、多态3. 初步掌握UML建模4. 熟悉S.O.L.I.D原则5. 了解设计模式二、实验步骤(一)单元测试1.三种代码&#xff1a;伪代码、…

jade软件_TEM衍射斑点标定之DM软件

虽然透射电子显微镜(TEM) 能在纳米尺度上实现对待测样品形貌、 尺寸的分析&#xff1b; 结合选区电子衍射(SAED)&#xff0c;可以更进一步实现对待测样品的晶体结构、 晶相组成的鉴定&#xff0c;从而提高样品分析的准确度和可靠性。可是&#xff0c;每个刚接触TEM的小白&#…

dorado 7 怎么样_一点点奶茶怎么样?消费者眼中的网红奶茶

最近在朋友圈, -款奶茶火速蹿红,不错,那正是近期疯传的网红奶茶一点点奶茶。一点点奶茶是-款主打台湾正宗波霸奶茶的茶饮品牌,而这样的奶茶在现在的市场中就表现的十分有潜力, 尤其受年轻群体的喜欢!一点点奶茶怎么样?它的崛起是无可厚非的,它那美丽的外形,别具-格的属性&…