java中关键字:final

解密Java面试题:final修饰的ArrayList容量为10,添加第11个元素究竟会发生什么? 大家好,我是小米!今天我们来深入探讨一个有趣的面试题:一个ArrayList被final修饰,初始化的容量设置为10,在添加第11个元素的时候能否成功?这道题目在技术面试中经常出现,让我们一起来看看它的答案吧。 阅读详情

Java中的final共有三种用法:

final成员变量
当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变,但引用变量所指向的对象中的内容还是可以改变的。

其初始化可以在三个地方,
一是其定义处,也就是说在final变量定义时直接给其赋值,
二是在构造函数中。而且在Java1.1以前,只能是在定义时给值。
三是在初如化代码块中{} 或者 static{}
下面这段代码演示了这一点:更加详细的探讨请参考关于final变量的初始化探讨

 

import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;

public class Bat {

    final double 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;   syntax error  i是不可变的
        //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 StringBuffer a=new StringBuffer("immutable");
  执行如下语句将报告编译期错误:

a=new StringBuffer("");
  但是,执行如下语句则可以通过编译:

a.append(" broken!");

有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:

public void method(final  StringBuffer  param)

{

}

实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象,其它对象亦如此:

  param.append("a");


在看一个例子
//: FinalData.java
//The effect of final on fields
class Value {
    int i = 1;
}

public class FinalData {
    // Can be compile-time constants
    final int i1 = 9;
    static final int I2 = 99;
  
    // Typical public constant:
    public static final int I3 = 39;
  
    // Cannot be compile-time constants:
    final int i4 = (int) (Math.random() * 20);
    static final int i5 = (int) (Math.random() * 20);
  
    Value v1 = new Value();
    final Value v2 = new Value();
    static final Value v3 = new Value();
    // ! final Value v4; // Pre-Java 1.1 Error:for no initializer
  
    // Arrays:
    final int[] a = { 1, 2, 3, 4, 5, 6 };

    public void print(String id) {
        System.out.println(id + ": " + "i4 = " + i4 + ", i5 = " + i5);
    }

    public static void main(String[] args) {
        FinalData fd1 = new FinalData();
        // ! fd1.i1++; // Error: can't change value,因为i1是final的
        fd1.v2.i++; // Object isn't constant! 这个可以是因为类Value中的i是普通变量
        fd1.v1 = new Value(); // OK -- not final
        for (int i = 0; i < fd1.a.length; i++)
            fd1.a[i]++; // Object isn't constant!

    //下面三个犯同样的错误 Error: Can't change handle
        // ! fd1.v2 = new Value();
        // ! fd1.v3 = new Value(); //
        // ! fd1.a = new int[3];
        fd1.print("fd1");
        System.out.println("Creating new FinalData");

        FinalData fd2 = new FinalData();
        fd1.print("fd1");
        fd2.print("fd2");
    }
}
输出结果(由于上面用了随机函数,所以输出结果可能不一样,但是规律是一样的):
fd1: i4 = 4, i5 = 6
Creating new FinalData
fd1: i4 = 4, i5 = 6
fd2: i4 = 10, i5 = 6
结果分析:fd1与fd2的i4发现值总是不一样,但i5的值却是一样的,这是为什么呢?
 我们可以发现定义i4与i5惟一的区别是后者多了一个static,由于final变量和static变量可以说
 都只能存一个数据,他们惟一的区别是static变量是属于类的,是类变量,只会被加载一次。
 请参考该文章:Java_父类与子类的加载原理
 而i4虽然是final的,但是它仍是个普通变量,属于实例变量,每创建一个对象还是会被加载一次,又
 由于是个随机函数,所以最终的结果不一样。
所以:一定要区分final与static final的细微差别。

使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。

 


此程序很简单的演示了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进行方法定义。

类中所有的private方法从某种意义上讲都是属于final的,因为他们在其它地方没法覆盖,你可以在一个private方法前加final修饰符,但没什么意义。


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

final class finals {
    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) {
        finals f = new finals();
        f.what();
        f.print();
    }
}

从程序中可以看出,final类与普通类的使用几乎没有差别,只是它失去了被继承的特性。final方法与非final方法的区别也很难从程序行看出,只是记住慎用。

 

原文地址:http://zhidao.baidu.com/question/357580512.html

FinsTCP协议的Java Socket 在网上并无找到关于欧姆龙的FinsTcp协议的调试工具和仿真软件,但找到的一部分资料有使用一些Tcp/UdpSocket调试工具跟下位机PLC进行网络通信,因此个人认为上位机可以使用Java编写程序,通过Socket发送相关指令给下位机,进行握手连接和数据获取。         下位机的默认端口是9600,上位机通过该端口与下位机相连。         下面给出模拟数据,其中上位机ip假设为1 阅读详情

相关推荐

教妹学Java:再见了,我的final 关键字

final 关键字 “哥,今天学什么呢?” “今天学一个重要的关键字——final。 ”我面带着朴实无华的微笑回答着她,“对了,三妹,你打算考研吗?” “还没想过,我今年才大一呢,到时候再说吧,你决定。” “好吧。”我摊摊手,表示很无辜,真的是所有的决定都交给我这个哥哥了,如果决定错了,锅得背上。 01、final 变量 “好了,我们先来看 final 修饰的变量吧!” “被 final 修饰的变量无法重新赋值。换句话说,final 变量一旦初始化,就无法更改。” “来看这行代码。” final int a

沉默王二 2907

java 之final用法

final 修饰符分两种情况:如果是修饰基本类型,如果整形,浮点型,如 final int i=100,这里的i的值是不能变的如果修饰的是对象,如final String s = "dddd";,这里的引用是不能变的,比如你不能这样写:s = "bbbbb";但对象的值可以改变。在java里面,数组是被看做是一个对象的,所以这个final不能阻止通过数组下标来访问对象进行值的改变。 1:修饰变量

caojing3231509的专栏 1288

JAVA中的final关键字用法实例详解

主要介绍了JAVA中的final关键字用法,结合实例形式较为详细的分析了Java中的final关键字用于修饰数据,方法及类的具体使用技巧,需要的朋友可以参考下

谈谈final

用final修饰类  这种情况很简单,这个类不能被继承。它"绝后"了。 用final修饰方法 这里可以分两种情况。 用final修饰private方法。其实也不能这么说,英文私有方法也被编译器隐式修饰为final,这意味着private final void f()和private void f()并无区别。 用final修饰public方法。 那么此方法不能被重写。  用fi

程序员小董的专栏 1783

Codesys.运动控制修改凸轮点

通过改凸轮曲线的主从轴缩放比例或者偏置。 新建多个凸轮曲线,对CAM曲线进行切换。 程序中动态修改,仅修改中间的关键点(凸轮末点修改or凸轮曲线运行中修改)。 程序中动态修改,修改首未关键点及关键点个数,需要重新触发MC_TableSelect。 使用程序新建凸轮表代码,实现电子凸轮基本运动。 我们讲的凸轮表切换、关键点修改、程序新建电子凸轮,这些方法没有本质区别,总之都是“趁曲线不注意,把凸轮表改了。

傻响雨 6828

RealSense D455的标定并运行VINS-FUSION

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

qq_40186909的博客 2万+

final关键字_夯实基础:Java中final关键字的几种用法

导语在java的关键字中,static和final是两个我们必须掌握的关键字。不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构。关于static请查阅前一篇文章:夯实基础:详解static关键字和4类场景应用下面我们来了解一下final关键字及其用法。final关键字在java中,final的含义在不同的场景下有细微的差别,但总体上来说,它指的是“这...

weixin_39772388的博客 102

【芯片验证随心记】1.SystemVerilog中,rand和randc的区别?如何用constraint实现randc?

在SystemVerilog里,randc 的“不重复循环”特性是用一个 周期性排列器(permutation engine) 实现的,而这个引擎在 LRM 里并没有公开。我们只能在 “用户空间” 用 rand + constraint 去模仿它的行为。每次随机化只取 queue.pop_front(),用完再洗。在4次随机化内,y会依次出现0,1,2,3各一次(顺序随机)每次随机化,x可能是0-3中的任意值,可能连续多次相同。每次随机化时,在未使用的值里随机挑一个;第5次随机化时,重新生成新的排列周期。

qq_43172512的博客 342

Java学习之:final 关键字的用法总结

final关键字常用的4种用法 可以用来修饰一个类 可以用来修饰一个方法 可以用来修饰一个局部变量 可以用来修饰一个成员变量 对于类、方法来说:abstract 关键字和 final 关键字不能同时使用,因为 abstract 修饰的抽象类或者方法一定要通过覆盖重写才有意义,而 final 定义的东西都不能再被重写,所以矛盾 final 修饰一个类 格式: public final class 类名称 {方法体} 要把 final 放到 class 之前 final 修饰的类称为太

qq_42902997的博客 366

基于LSTM的多变量温度预测(python从入门到入坑)

基于LSTM的多变量温度预测(python) ——我保证他能够运行,而且结果能够让你满意(如果你和我一样都是一个新手的话) 这里写目录标题基于LSTM的多变量温度预测(python)——我保证他能够运行,而且结果能够让你满意(如果你和我一样都是一个新手的话)一、我为什么要写这些?二、具体做了什么?三、源代码切块加注释,恳请批评指正(●’◡’●)ノ 一、我为什么要写这些? 因为让人抓狂的课程大作业,我小组选择了一个多变量预测方面的课题,在我这个大三基本上还没接触过Python数据处理,甚至对神经网络什么的都

代码之狐的博客 1万+

MiniMax H3 + ComfyUI 工作流搭建指南:从整合包到视频生成

AI视频生成正成为内容创作的新基础设施,而ComfyUI作为可视化工作流引擎,将复杂的模型推理过程拆解为节点与连线,让本地视频生成变得可复用、可批量。理解这一原理后,用户无需编写代码,只需掌握模型加载、提示词控制、采样与解码的基本链路,即可搭建出稳定的视频生产管线。MiniMax H3作为前沿视频生成模型,在ComfyUI中通过权重文件和自定义节点落地,配合整合包可大幅降低环境配置门槛。从硬件评估、目录结构到节点连接与参数调优,本文系统性梳理了从零跑通一条视频生成工作流的完整路径,帮助用户在批量素材生成、风

weixin_29057065的博客 411

Java基础(十):关键字static、代码块、关键字final

对比静态变量与实例变量。

从基础到源码解析的学习记录 1076

【AI智能体】Hermes Agent 从部署到项目实战操作详解

Hermes Agent 桌面版从安装到实战操作详解

congge 5130

Java中的final关键字可以修饰什么?被final修饰后有什么特点? (考点:final关键字的用法)

2301_78838184的博客 392

【异常检测】【EfficientAD】论文简单梳理与代码实现

EfficientAD作为较近的一篇异常检测网络,主要还是从S-T网络入手,对齐进行了相关改进。修改特征提取器引入自动编码器hard loss以及惩罚项。

胡侃有料的博客 2854

105、LLC谐振变换器的LTspice仿真建模

文章摘要:本文分享了LLC谐振变换器在LTspice中的仿真建模经验。作者从实际调试中炸管的教训出发,指出数学计算无法捕捉瞬态问题,必须通过仿真验证。详细介绍了半桥LLC主电路搭建、理想元件选择、开环增益扫频、闭环控制实现等关键步骤,重点讲解了启动过程、ZVS验证和短路保护等高风险工况的仿真技巧。文章提供了实用参数设置建议和LTspice代码片段,强调先开环后闭环的调试顺序,并提醒仿真结果需保留20%设计裕量。最后总结了谐振电流波形观察、死区时间优化等经验性建议。

Jack010169的博客 224

Java关键字:final,static,this,super

1. final 关键字: final 关键字,意思是最终的、不可改变的,初始化之后就不能再次修改 ,用来修饰类、方法和变量,具有以下特点: final 修饰的类不能被继承,final类中的所有成员方法都会被隐式的指定为 final 方法; final 修饰的方法不能被重写; final 修饰的变量是常量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能让其指向另一个对象; final的使用场景:使用 final 方法的原因有两个。第一个

JavaMonsterr的博客 123

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Java学习总结:11(final关键字)

final关键字 在Java中final称为终结器,在Java中可以使用final定义类、方法和属性。 一.使用final定义的类不能再有子类,即:任何类都不能继承以final声明的父类。 final class A{ //此类不能够有子类 } class B extends A{ //错误的继承 } 注意:String也是使用final定义的类,所以String类不允许被继承。 二.使用fin...

小关同学的博客 184

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java关键字(五):final

Java关键字(五):final前言" final "关键字的使用一、理解二、作用1. 修饰 "类"2. 修饰 "方法"3. 修饰 "变量"3.1 修饰 "成员变量(属性)"3.2 修饰 "局部变量"三、经典题目 前言 本博主将用优快云记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主! 也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习,欢迎关注! " final "关键字的使用 一、理解 final:最终的 二、作用 fi

weixin_52533007的博客 1111

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

关键字的用法_夯实基础:Java中final关键字的几种用法

导语在java的关键字中,static和final是两个我们必须掌握的关键字。不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构。关于static请查阅前一篇文章:夯实基础:详解static关键字和4类场景应用下面我们来了解一下final关键字及其用法。final关键字在java中,final的含义在不同的场景下有细微的差别,但总体上来说,它指的是“这...

weixin_33901449的博客 111

java final关键字_技术大佬:我去,你竟然还不会用 Java 的 final 关键字

写一篇文章容易吗?太不容易了,首先,需要一个安静的环境,这一点就非常不容易。很多小伙伴的办公室都是开放式的,非常吵,况且上班时间写的话,领导就不高兴了;只能抽时间写。其次,环境有了,还要有一颗安静的心,如果心里装着其他挥之不去的事,那就糟糕了,呆坐着电脑前一整天也不会有结果。我十分佩服一些同行,他们写万字长文,这在我看来,几乎不太可能完成。因为我要日更,一万字的长文,如果走原创的话,至少需要一周时...

weixin_39622084的博客 115

Java关键字:final

final关键字可以声明类、成员变量、方法、本地变量。 // 声明类 // 不允许被继承 Cannot inherit from final 'java.lang.String' public final class String implements java.io.Serializable, Comparable<String>, CharSequence { } // 声明成员变量 private static final long serialVersionUID = -6849

藿香正气的博客 469

Java:深入了解final关键字

A.final关键字可以用于成员变量、本地变量、方法以及类。B.final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误。C.不能够对final变量再次赋值。D.本地变量必须在声明时赋值。F.final方法不能被重写。G.final类不能被继承。H.final关键字不同于finally关键字,后者用于异常处理。I.final关键字容易与finalize()方法搞混,后者是在Object类中定义的方法,是在垃圾回收之前被JVM调用的方法。

王小二(海阔天空) 516

Java基础:final关键字

Java中final的使用注意事项

愿你我都能实现自己的梦想 780

Java关键字:final、default、transient

1、final final关键字可以用来修饰类、方法、变量。final修饰类表示该类是无法被继承的。final修饰方法表示该方法无法被覆写。final修饰变量表示该变量的内存地址无法被修改的,并且一旦声明就必须被初始化。 final修饰类可见String类,为了防止String被继承覆写其中的方法用了final关键字来修饰。final修饰方法常见于工具类中的方法,工具方法为了方便调用也会同时使用static来修饰,如Java中的工具类Collections等。final常与static同时使用来修饰常量,比

庄北的专栏 490

Java:final关键字

1.final作为关键字,表示不可变的 2.final修饰的类无法被继承 3.final修饰的方法无法被覆盖 4.final修饰的变量一旦赋值后不可覆盖 5.final修饰的引用不能更改为其他引用,但是引用内部可以改变 6.final常常与static连用,表示不可改变的常量,例如 public final static double pi=3.1415926; packa...

浏览器开发教学 154
上一篇: 编译原理 Switch语句的分析
下一篇: java中关键字:static
Jast_Zhang
博客等级 码龄15年 12粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值