问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

JAVA中final的作用及意思??

发布网友 发布时间:2022-04-25 14:55

我来回答

5个回答

热心网友 时间:2023-10-10 04:50

final在Java中并不常用,然而它却为我们提供了诸如在C语言中定义常量的功能,不仅如此,final还可以让你控制你的成员、方法或者是一个类是否可被覆写或继承等功能,这些特点使final在Java中拥有了一个不可或缺的地位,也是学习Java时必须要知道和掌握的关键字之一。
final成员
  当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变。其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中。这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值。下面这段代码演示了这一点:
import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;
public class Bat{
final PI=3.14; //在定义时便给址值
final int i; //因为要在构造函数中进行初始化,所以此处便不可再给值
final List list; //此变量也与上面的一样
Bat(){
i=100;
list=new LinkedList();
}
Bat(int ii,List l){
i=ii;
list=l;
}
public static void main(String[] args){
Bat b=new Bat();
b.list.add(new Bat());
//b.i=25;
//b.list=new ArrayList();
System.out.println("I="+b.i+" List Type:"+b.list.getClass());
b=new Bat(23,new ArrayList());
b.list.add(new Bat());
System.out.println("I="+b.i+" List Type:"+b.list.getClass());
}
}
  此程序很简单的演示了final的常规用法。在这里使用在构造函数中进行初始化的方法,这使你有了一点灵活性。如Bat的两个重载构造函数所示,第一个缺省构造函数会为你提供默认的值,重载的那个构造函数会根据你所提供的值或类型为final变量初始化。然而有时你并不需要这种灵活性,你只需要在定义时便给定其值并永不变化,这时就不要再用这种方法。在main方法中有两行语句注释掉了,如果你去掉注释,程序便无法通过编译,这便是说,不论是i的值或是list的类型,一旦初始化,确实无法再更改。然而b可以通过重新初始化来指定i的值或list的类型,输出结果中显示了这一点:
I=100 List Type:class java.util.LinkedList
I=23 List Type:class java.util.ArrayList
  还有一种用法是定义方法中的参数为final,对于基本类型的变量,这样做并没有什么实际意义,因为基本类型的变量在调用方法时是传值的,也就是说你可以在方法中更改这个参数变量而不会影响到调用语句,然而对于对象变量,却显得很实用,因为对象变量在传递时是传递其引用,这样你在方法中对对象变量的修改也会影响到调用语句中的对象变量,当你在方法中不需要改变作为参数的对象变量时,明确使用final进行声明,会防止你无意的修改而影响到调用方法。
另外方法中的内部类在用到方法中的参变量时,此参变也必须声明为final才可使用,如下代码所示:
public class INClass{
void innerClass(final String str){
class IClass{
IClass(){
System.out.println(str);
}
}
IClass ic=new IClass();
}
public static void main(String[] args){
INClass inc=new INClass();
inc.innerClass("Hello");
}
}
final方法
  将方法声明为final,那就说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。另外有一种被称为inline的机制,它会使你在调用final方法时,直接将方法主体插入到调用处,而不是进行例行的方法调用,例如保存断点,压栈等,这样可能会使你的程序效率有所提高,然而当你的方法主体非常庞大时,或你在多处调用此方法,那么你的调用主体代码便会迅速膨胀,可能反而会影响效率,所以你要慎用final进行方法定义。
final类
  当你将final用于类身上时,你就需要仔细考虑,因为一个final类是无法被任何人继承的,那也就意味着此类在一个继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要进行修改或扩展。对于final类中的成员,你可以定义其为final,也可以不是final。而对于方法,由于所属类为final的关系,自然也就成了final型的。你也可以明确的给final类中的方法加上一个final,但这显然没有意义。
  下面的程序演示了final方法和final类的用法:
final class final{
final String str="final Data";
public String str1="non final data";
final public void print(){
System.out.println("final method.");
}
public void what(){
System.out.println(str+"\n"+str1);
}
}
public class FinalDemo { //extends final 无法继承
public static void main(String[] args){
final f=new final();
f.what();
f.print();
}
}
  从程序中可以看出,final类与普通类的使用几乎没有差别,只是它失去了被继承的特性。final方法与非final方法的区别也很难从程序行看出,只是记住慎用。
final在设计模式中的应用
  在设计模式中有一种模式叫做不变模式,在Java中通过final关键字可以很容易的实现这个模式,在讲解final成员时用到的程序Bat.java就是一个不变模式的例子。如果你对此感兴趣,可以参考阎宏博士编写的《Java与模式》一书中的讲解。

热心网友 时间:2023-10-10 04:51

(1)final标记的类不能被继承
(2)final标记的方法不能被子类重写
(3)final标记的变量为常量,只能赋值一次
如:
final int Y=2;
Y=3;// 出错
(4)final标记的成员变量必须在声明的同时赋值,或在该类的构造方法中显示赋值,然后才能使用,如:
class Test{
final int X=5;
Test(){
X=3;
}
}
(5)方法中定义的内置类只能访问该方法内的final类型的局部变量,用final定义的局部变量相当于一个常量,它的生命周期长于方法运行的生命周期。
(6)将一个形参定义成final也是可以的,这就*了在方法中修改形参的值范围。

热心网友 时间:2023-10-10 04:51

final方法
将方法声明为final,那就说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。另外有一种被称为inline的机制,它会使你在调用final方法时,直接将方法主体插入到调用处,而不是进行例行的方法调用,例如保存断点,压栈等,这样可能会使你的程序效率有所提高,然而当你的方法主体非常庞大时,或你在多处调用此方法,那么你的调用主体代码便会迅速膨胀,可能反而会影响效率,所以你要慎用final进行方法定义。

final类
当你将final用于类身上时,你就需要仔细考虑,因为一个final类是无法被任何人继承的,那也就意味着此类在一个继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要进行修改或扩展。对于final类中的成员,你可以定义其为final,也可以不是final。而对于方法,由于所属类为final的关系,自然也就成了final型的。你也可以明确的给final类中的方法加上一个final,但这显然没有意义。

热心网友 时间:2023-10-10 04:52

final方法
将方法声明为final,那就说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展。

final是JAVA的一个关键字有:final类final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。

解析如下:
另外有一种被称为inline的机制,它会使你在调用final方法时,直接将方法主体插入到调用处,而不是进行例行的方法调用,例如保存断点,压栈等,这样可能会使你的程序效率有所提高,然而当你的方法主体非常庞大时,或你在多处调用此方法,那么你的调用主体代码便会迅速膨胀,可能反而会影响效率,所以你要慎用final进行方法定义。

当你将final用于类身上时,你就需要仔细考虑,因为一个final类是无法被任何人继承的,那也就意味着此类在一个继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要进行修改或扩展。

热心网友 时间:2023-10-10 04:53

定义常量,一些在程序中不变的量用final定义
比如Pi=3.14159265
容易出错的常量用final,以免数据变动
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
什么叫背板 下列关于遵义会议的表述,不正确的是彻底清算了王明的左倾路线吗_百度知 ... 抖店注销后抖音号能解绑吗?还能开吗? 请问腱鞘炎必须打封闭针吗? 突然两个手手腕内侧都得了腱鞘炎,动一下就疼,除了打封闭针,还有什麽办 ... 得了腱鞘炎一定要打封闭吗? 下雨了,来接孩子的家长们撑着雨伞,仿佛像什么 华为MatePadPro搭载哪一款处理器华为MatePadPro处理器介绍【详解】 支付宝APP商家怎么申请收款二维码 申请方法介绍 SVG动画从入门到实战,提升你的网站表现力 家居装修可以用VR拍摄实景吗 拍室内装修效果一般需要哪些镜头 电脑设备管理器里的两个显卡都有*感叹号,错误43,亮度调节功能失效? java中的"final"关键字在多线程的语义中,有什么含义 装修中的施工现场的实景图是用什么相机拍摄出来的呢 JAVA中final的作用及意思分别是什么? 苹果6s无法设置指纹 ktmrc390和川崎400哪个更适合跑长途? rc380和rc390马达区别 KTM RC390 2021款最新消息 换上更大的“炸裂脸”年底发布 rc390一档能跑多少 官宣:KTM RC390将引入国内市场,可惜变化不太大 KTMfuke390和RC390后避震一样吗? ktm390这种摩托车怎么样 17款rc390跟duke390 小忍者300abs 官方报价多少 到手价又是多少 跪求老司机 RC390多少转断油 rc390一档多少断油 rc390和duke390哪个好翘头 11笔画和7笔画的字有哪些取名 七画字男孩名属马起名 独立显卡总是有一个感叹号(提示错误代码43) 家装全景效果图是怎么做的? 装修vr全景效果图需要用什么软件做? 显卡图标有黄色感叹号,有什么事吗? 中国股市现在市值还有多少? 拍装修效果用那种相机比较合适 Java中的关键字static和final的作用是什么? 今天沪深股市收盘多少点 怎么拍出漂亮的,效果好的房间照片 现在股票指数多少点? 怎么用720做的室内装修全景效果图的 在Java中,为什在定义常量中要加修饰符final?到底起什么作用呢,能不能不加? 中国股市现在有多少支股票深股市目前共有多少只股票 Java中的final关键字有哪些用法? 为什么我家别墅装修的实景与效果图相差那么远 final,在Java中有哪些作用 win7使用独立显卡出现感叹号,显示错误代码(12),有哪位朋友知道如何解决吗?_百度问一问 中国股市目前总市值有多少 显卡出现叹号应该怎么解决 我国股市现在总市值是多少?