深入理解Java中不常见的关键字:`instanceof`、`strictfp`、`transient`、`volatile`

news2024/9/20 20:22:27

Java语言拥有许多常见的关键字,如classifelsepublic等,这些关键字在日常开发中被频繁使用。然而,Java还提供了一些相对不常见但功能非常重要的关键字,它们能够处理特定的场景和需求,提升代码的灵活性和性能。本文将深入介绍几个不常见的Java关键字,如instanceofstrictfptransientvolatile,并解释它们的用法及相关注意事项。

1. instanceof:类型检查关键字

1.1 概念

instanceof是Java中的一个二元运算符,用于检查对象是否是某个类或接口的实例。它通常在多态性和类型转换的场景中被使用,确保对象在进行类型转换之前,满足目标类型的要求,从而避免ClassCastException的发生。

1.2 使用示例

class Animal { }

class Dog extends Animal { }

public class InstanceofExample {
    public static void main(String[] args) {
        Animal animal = new Dog();  // Animal 引用指向 Dog 对象

        if (animal instanceof Dog) {
            Dog dog = (Dog) animal;  // 安全的向下转型
            System.out.println("This is a dog.");
        } else {
            System.out.println("This is not a dog.");
        }
    }
}

在这个例子中,instanceof确保了animal对象是Dog类型的实例,只有在检查通过后才进行类型转换。这不仅提高了程序的健壮性,还避免了潜在的类型转换异常。

1.3 重要注意事项

  • instanceof关键字是一个安全的方式来进行类型检查,在多态性中非常有用。
  • 如果对象是null,则instanceof总是返回false
  • 当用于类的继承或接口的实现时,它可以检测到子类或实现类是否符合特定的父类或接口。

2. strictfp:精确浮点运算

2.1 概念

strictfp 关键字用于限制浮点数的计算精度和结果,使其在不同平台上保持一致。默认情况下,Java的浮点计算可能会因为底层硬件的不同(如不同的CPU架构)而产生略微的差异。strictfp关键字确保浮点运算遵循IEEE 754标准,从而确保跨平台的精确一致性。

2.2 使用示例

strictfp class StrictfpExample {
    public double calculate() {
        double a = 0.7;
        double b = 0.2;
        return a * b;
    }
}

在这个例子中,strictfp保证了浮点数计算在不同的计算机架构上遵循相同的IEEE标准。

2.3 适用场景

strictfp可以用在类、接口或方法上:

  • 如果在类或接口前加strictfp,该类或接口中的所有浮点计算都会严格遵守IEEE 754标准。
  • 如果在方法前加strictfp,则该方法中的浮点计算遵循相同的标准。

2.4 重要注意事项

  • 仅影响浮点运算(floatdouble),与整数运算无关。
  • 在现代系统中,平台差异通常很小,因此strictfp更多用于对精度要求极高的应用场景。

3. transient:控制序列化的字段

3.1 概念

transient关键字用于修饰类的字段,表示该字段不应被序列化。当Java对象被序列化时,transient修饰的字段不会被写入对象的字节流中。这在处理一些不需要持久化的敏感数据时非常有用,例如密码字段或临时缓存数据。

3.2 使用示例

import java.io.*;

class User implements Serializable {
    private String username;
    private transient String password;  // 不会被序列化

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    @Override
    public String toString() {
        return "Username: " + username + ", Password: " + password;
    }
}

public class TransientExample {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        User user = new User("JohnDoe", "secret");

        // 序列化
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user.ser"));
        oos.writeObject(user);
        oos.close();

        // 反序列化
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("user.ser"));
        User deserializedUser = (User) ois.readObject();
        ois.close();

        System.out.println(deserializedUser);  // Password 将会是 null
    }
}

在上面的例子中,password字段被标记为transient,因此不会在序列化过程中保存。在反序列化后,password的值为null

3.3 适用场景

  • 用于标记那些不需要持久化的数据,比如缓存、临时变量或敏感信息。
  • transient字段通常在反序列化后需要重新计算或手动赋值。

3.4 重要注意事项

  • 仅影响对象序列化时的字段处理,不影响字段在内存中的正常使用。
  • transient不会影响静态字段,因为静态字段本身不参与序列化。

4. volatile:保证可见性和顺序性

4.1 概念

volatile关键字用于修饰变量,确保该变量的修改对于所有线程是可见的。在多线程编程中,JVM为了优化性能,可能会将变量的值缓存在线程的本地内存中(而非直接操作主存)。使用volatile修饰的变量强制线程从主内存中读取,而非线程的本地缓存,这保证了变量的可见性

4.2 使用示例

class VolatileExample extends Thread {
    private volatile boolean running = true;

    public void run() {
        while (running) {
            // 执行任务
        }
        System.out.println("Thread stopped.");
    }

    public void stopRunning() {
        running = false;
    }
}

public class Main {
    public static void main(String[] args) throws InterruptedException {
        VolatileExample thread = new VolatileExample();
        thread.start();

        Thread.sleep(1000);  // 主线程暂停1秒
        thread.stopRunning();  // 修改running变量
        System.out.println("Main thread updated running to false.");
    }
}

在这个例子中,running变量被标记为volatile,确保它的修改对其他线程是可见的。当主线程修改running的值时,工作线程能够立即感知并停止循环。

4.3 适用场景

  • 用于在多线程环境下,需要共享变量的场景,确保每个线程能够正确读取到最新的值。
  • 适用于轻量级同步,代替使用锁来保证变量的可见性。

4.4 重要注意事项

  • volatile仅保证可见性,不保证原子性。例如,volatile不能确保i++(读、改、写操作)的原子性。
  • 对于复杂的原子操作,仍需使用同步(synchronized)或Lock机制

5. 总结

Java中的一些不常见关键字如instanceofstrictfptransientvolatile,在特定场景下提供了强大的功能支持。尽管它们在日常开发中并不经常使用,但了解这些关键字的用途和正确使用方式,可以帮助开发者在合适的情况下编写更高效、更安全的代码。

  • instanceof:用于安全地检查对象的类型,在多态和类型转换中至关重要。
  • strictfp:确保浮点运算在不同平台上的一致性,对于高精度计算很有帮助。
  • transient:控制序列化字段,保护敏感数据或标记不需要持久化的字段。
  • volatile:在多线程环境中确保变量的可见性,适合轻量级的同步需求。

通过理解这些关键字,开发者可以更灵活地处理复杂的Java应用场景。

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

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

相关文章

【JavaScript】数据结构之链表(双指针、滑动窗口)

什么是链表? 多个元素存储的列表链表中的元素在内存中不是顺序存储的,而是通过“next”指针联系在一起的,这个“next”可以自定义。JS中的原型链原理就是链表结构,是通过__proto__指针联系在一起的。 双指针形式 对撞指针&am…

分布式事务一致性:本地消息表设计与实践

概念 本地消息表是一种常见的解决分布式事务问题的方法。其核心思想是将分布式事务拆分成本地事务来处理,通过消息队列来保证各个本地事务的最终一致性。 实现步骤 创建本地消息表:在数据库中创建一个本地消息表,用于存储待发送的消息以及消…

【图像检索】基于灰度共生矩的纹理图像检索,matlab实现

博主简介:matlab图像代码项目合作(扣扣:3249726188) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于灰度共生矩的纹理图像检索,用matlab实现。 一、案例背景和算法介绍 …

从“群聊”到“一单到底”,天润融通工单系统助力品牌服务升级

“您好,我在xx店买的酸奶出现了质量问题,怎么处理?” “你们xx门店的服务态度怎么那么差啊,我要投诉!” “您好,xx店的微波炉总是坏的,店员根本不管!” 这些耳熟能详的抱怨&#…

【qt】一个WPS项目了解qt界面设计的基本套路

项目功能演示: 放心食用!最后有完整代码. 超级详细,期待您的一个点赞❥(^_-) 一览全局: WPS项目目录 一.创建项目二.导入资源三.ui设计四.字号选择框初始化五.滚动条初始化六.添加自定义文本类七.初始化action状态八.新建文档九.打开文件十.保存与另存为十一.打印/打印预览十…

MySQL高阶1867-最大数量高于平均水平的订单

目录 题目 准备数据 分析数据 题目 您正在运行一个电子商务网站,该网站正在寻找不平衡的订单。不平衡订单的订单最大数量严格大于每个订单(包括订单本身)的平均数量。 订单的平均数量计算为(订单中所有产品的总数量&#xff…

visionpro脚本

visionproToolBlock的脚本的优先级优于工具连线的优先级,一般是照着脚本的执行顺序进行执行对应的工具,最常用的是C#的高级脚本,C#的脚本如下分为5部分。 第一部分:主要是一些库的引用,对于有些类型不知道库的时候&…

14_Python面向对象

面向过程与面向对象 在编程范式(programming paradigms)中,面向过程(Procedural Programming)和面向对象(Object-Oriented Programming,简称OOP)是两种主要的编程风格。 Python是一…

【医学半监督】置信度指导遮蔽学习的半监督医学图像分割

摘要: 半监督学习(Semi-supervised learning)旨在利用少数标记数据和多数未标记数据训练出高性能模型。现有方法大多采用预测任务机制,在一致性或伪标签的约束下获得精确的分割图,但该机制通常无法克服确认偏差。针对这一问题,本文提出了一种用于半监督医学图像分割的新…

(十六)Ubuntu 20.04 下搭建PX4+MATLAB 仿真环境(HITL)

在文章(十五)Ubuntu 20.04 下搭建PX4MATLAB 仿真环境我们学习了如何配置仿真环境,在本节,主要进行HITL的仿真环境搭建。 根据(十五)Ubuntu 20.04 下搭建PX4MATLAB 仿真环境完成配置到如下界面:…

志邦家居CIO吴俊涛谈转型:天润融通如何赋能家居行业未来

根据国家统计局、住建部等各部门综合数据显示,2024年国内泛家居全渠道销售额在预计将超过4.7万亿元,并且在存量房需求释放与智能家居品类创新的推动下,预计2027年将突破5.3万亿元,展现出强劲的增长弹性。 然而,家居行…

【matlab】将程序打包为exe文件(matlab r2023a为例)

文章目录 一、安装运行时环境1.1 安装1.2 简介 二、打包三、打包文件为什么很大 一、安装运行时环境 使用 Application Compiler 来将程序打包为exe,相当于你使用C编译器把C语言编译成可执行程序。 在matlab菜单栏–App下面可以看到Application Compiler。 或者在…

mybatisplus逻辑删除

逻辑删除配置 mybatis-plus:global-config:db-config:logic-delete-field: deletedlogic-not-delete-value:0logic-delete-value:1 查询语句也会自动加上where isdeleted0

FedOV

3 FEDOV: ONE-SHOT FEDERATED OPEN-SET VOTING FRAMEWORK 3.1 PROBLEM STATEMENT 假设有个客户端及其本地数据集。我们的目标是在服务器的帮助下,在不交换原始数据的情况下,训练一个优秀的机器学习模型 。此外,每个客户端只允许与服务器进行…

Linux 删除文件不释放空间问题处理

背景: 服务器磁盘空间已经达到100%,删除存放日志路径下的文件后,发现空间并未释放! 原因:在linux系统中,通过rm删除文件将会从文件系统的文件夹结构上解除链接(unlink)然后删除,然而假设文件是被…

基于存内计算架构的模型部署与映射优化

先进计算大赛背景: ‘’存内计算”架构通过消除存储与计算单元间的物理距离,突破传统冯诺依曼架构的限制,自2016年起受到广泛关注,被视为国产算力发展的关键技术。 ​ 在存内计算架构中,权重布局对提高存算单元利用率…

VBA技术资料MF198:禁用下拉拖放

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…

c++ day01

格式化输入 #include <iostream> #include<iomanip> using namespace std;int main() {double num1090.123456;cout<<"num"<<num<<endl;cout<<oct<<"num"<<num<<endl;cout<<hex<<&qu…

【C#】内存的使用和释放

在 C# 中&#xff0c;内存管理主要是由 .NET 的垃圾回收器&#xff08;Garbage Collector, GC&#xff09;自动处理的。然而&#xff0c;了解如何正确地使用和释放内存对于编写高效且可靠的代码非常重要。以下是一些关键点和最佳实践&#xff1a; 1. 内存分配 托管资源&#x…

如何查询论文的SCI检索号?

一、登录Web of Science 不要自己登录&#xff0c;需要选择机构为CHINA CERNET Federation&#xff0c;否则无法查询文章。 然后转到机构&#xff0c;选择对应的大学。 更具对应文章名查询文献。 二、查询文献名