【Java高级语法】(十二)可变参数:Java中的“可变之美“,做好这些细节,你的程序强大又灵活~

news2024/9/21 14:33:52

Java高级语法详解之可变参数

  • 🔹 前言
  • 1️⃣ 概念
  • 2️⃣ 优势和缺点
  • 3️⃣ 特征和应用场景
    • 3.1 特征
    • 3.2 应用场景
  • 4️⃣ 使用和原理
  • 5️⃣ 使用技巧
    • 5.1 可变参数结合泛型
    • 5.2 使用元组或列表进行参数传递
    • 5.3 使用默认值
    • 5.4 缓存计算结果
  • 6️⃣ 实战:构建动态日志工具
  • 🌾 总结

在这里插入图片描述

🔹 前言

你是不是曾经为了传递不确定数量的参数而纠结不已?在Java编程领域,我们常常遭遇需求多变的情况。为了应对这种情况,Java提供了一项强大而灵活的特性——可变参数(Variable Arguments)。通过灵活运用可变参数,我们可以让代码更加简洁、高效,减少冗余。本文将带你深入了解Java的可变参数机制和其魔幻般的应用。

当然,我们不能仅仅止步于表面,我们会深入探索可变参数的精髓。首先,我会向你介绍可变参数的基本语法,你将看到如何定义和使用这项魔法功能。

接下来,我们将进入更高级的领域,学习如何结合可变参数与其他特性,如方法重载和泛型。你将了解到如何发挥可变参数的真正威力,并将其应用于实际项目中。

此外,我还会与你分享几个聪明的技巧和最佳实践,以确保你能够充分利用可变参数的优势。你将学到如何处理边界情况、保持代码的可读性,并避免潜在的陷阱。

最后,我将通过一些实例和案例研究向你展示可变参数在实战中的威力。无论是构建动态日志工具,还是优化大型数据处理系统,可变参数都能助你一臂之力。

所以,朋友们,准备好迎接这个属于Java的魔法时刻了吗?让我们探索可变参数的奇妙世界,解锁编程的无限可能!

注意:本文适合已经掌握基本Java基础语法的读者。如果你对方法、参数等概念不熟悉,建议先学习相关基础知识再来挑战这个精彩的话题。


1️⃣ 概念

Java可变参数(Variable Arguments)是从Java 5版本开始引入的一种特性。它允许在方法中传递不定数量的参数,而无需明确指定参数的个数。 这种特性极大地提升了方法的灵活性和可扩展性。

可变参数的出现使得我们能够优雅地处理方法的重载问题。以前,为了满足不同参数个数的调用需求,我们不得不创建多个不同参数个数的方法。而现在,我们只需要定义一个带有可变参数的方法,就能自由传入任意个数的参数。这不仅简化了代码,还降低了代码维护的成本。

2️⃣ 优势和缺点

Java可变参数的优势及缺点如下所示:

优点

  • 灵活性:可变参数允许方法接受任意数量的参数,使得方法可以应对不同数量的输入;
  • 简洁性:相比于使用数组或集合作为参数,可变参数更加简洁,不需要手动创建和初始化数组;
  • 代码复用:通过使用可变参数,可以提高方法的重用性,避免编写多个具有不同参数个数的重载方法。

缺点

  • 性能影响:由于可变参数实际上是将参数打包成数组进行处理,因此可能对性能产生一定的影响;
  • 类型限制:可变参数只能位于方法的最后一个位置,并且只能有一个可变参数。这会限制一些方法的设计和使用场景。

3️⃣ 特征和应用场景

3.1 特征

可变参数具有如下特征,在实际使用时需要注意这些特点,避免不当的使用造成错误:

  • 可变参数本质上是一个数组,使用时像一个普通的形参一样声明;
  • 如果方法同时存在其他形参,可变参数必须放置在方法签名的最后一个位置
  • 在方法体内,可以将可变参数当作数组使用,进行遍历、操作或传递给其他方法。

3.2 应用场景

  • 日志框架 中的可变参数方法允许用户根据需要传递任意数量的日志消息;
  • 常见的工具类String.format()System.out.printf()等均使用了可变参数来格式化字符串;
  • 用于表示一个复杂对象的构造函数,其中一些属性由可变参数来表示。

4️⃣ 使用和原理

🍔 使用方式
声明可变参数时需要在类型后面加上省略号(...),例如public void methodName(Type... variableName)

下面是一个示例代码,演示了使用可变参数的方法:

public class VariableArgumentsExample {
    public static void sumNumbers(int... numbers) {
        int sum = 0;
        for (int num : numbers) {
            sum += num;
        }
        System.out.println("Sum: " + sum);
    }

    public static void main(String[] args) {
        sumNumbers(1, 2, 3); // 可传入任意数量的参数
        sumNumbers(4, 5, 6, 7, 8);
    }
}

运行结果:

Sum: 6
Sum: 30

在上述示例中,sumNumbers()方法接受可变参数numbers,并计算它们的总和。方法体内部使用了增强的for循环来遍历可变参数数组,实现求和的逻辑。

🔍 原理
编译器会将可变参数转换为数组,然后将其传递给方法。在方法内部,我们可以像操作数组一样操作这个参数。

下面是一个示例代码,演示了可变参数的原理:

 class PrincipleExample {
    public static void printInfo(String... numbers) {
        if (numbers instanceof String[]){
            System.out.println("传入的可变参数是一个字符串数组:" + numbers);
            for (int i = 0; i <= 3; i++) {
                System.out.println(numbers[i]);
            }
        }
    }

    public static void main(String[] args) {
        printInfo("hello","world","!"); // 可传入任意数量的参数
    }
}

运行结果:

传入的可变参数是一个字符串数组:[Ljava.lang.String;@1b6d3586
hello
world
!
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
	at com.example.PrincipleExample.printInfo(VariableArgumentsExample.java:26)
	at com.example.PrincipleExample.main(VariableArgumentsExample.java:32)

这个Java程序示例主要包含了一个类 PrincipleExample 和两个方法。

第一个方法 printInfo 是一个静态方法,接受可变参数 String... numbers。通过使用可变参数的语法 ...,该方法可以接受任意数量的字符串参数。在方法体内部,我使用 instanceof 运算符判断输入参数 numbers 是否为字符串数组类型(String[])。如果条件成立,即传入的参数确实为字符串数组,将打印出一条消息以及接下来的四个参数值(元素索引从0到3)。

由于循环条件是 i <= 3,所以导致了数组越界异常,程序报错打印出了异常信息。正确的应将循环条件修改为 i < numbers.length,以适应不同数量的输入参数。

5️⃣ 使用技巧

5.1 可变参数结合泛型

可变参数(Varargs)可以理解为一个方法接受可变数量的相同类型参数,它是Java语言提供的一种方便的语法糖。在方法声明中,使用三点(…)表示可变参数。在方法内部,可变参数被当作数组处理,允许将传入的参数当作数组来操作。

泛型是Java语言的一种特性,它使我们能够编写更加通用灵活的代码。通过引入类型参数,在创建实例或调用方法时,可以在编译期间指定类型,并且对其进行类型检查。这样就可以实现代码的重用和类型安全。

这两个特性之间并没有直接关联,但它们可以结合使用来优化代码的灵活性和可读性。下面是一个结合应用的示例:

public class VariableArgumentsAndGenerics {

    public static <T> void printArray(T... elements) {
        for (T element : elements) {
            System.out.print(element + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        Integer[] intArray = {1, 2, 3, 4, 5};
        Double[] doubleArray = {1.1, 2.2, 3.3, 4.4};

        // 使用可变参数和泛型的方法打印整型数组
        System.out.print("Integer Array: ");
        printArray(intArray);

        // 使用可变参数和泛型的方法打印双精度浮点型数组
        System.out.print("Double Array: ");
        printArray(doubleArray);

        // 使用可变参数和泛型的方法打印字符串数组
        System.out.print("String Array: ");
        printArray("Hello", "World");
    }
}

输出结果:

Integer Array: 1 2 3 4 5 
Double Array: 1.1 2.2 3.3 4.4 
String Array: Hello World 

在上述代码中,printArray是一个泛型方法,使用可变参数来接收不定数量的元素。无论传入的是什么类型的数组或者一系列对象,该方法都能够打印出这些元素。

main方法中,创建了一个整型数组、一个双精度浮点型数组,然后调用printArray方法分别打印了这两个数组的元素。另外,还传递了一系列字符串作为参数,同样可以成功打印出来。

通过使用可变参数和泛型结合的方法,我们可以灵活地处理不同类型的数据,并且无需在编写方法时预先确定参数的数量或者类型。
根据具体的需求,我们可以结合使用它们来设计更加灵活和强大的代码。

5.2 使用元组或列表进行参数传递

可变参数通常使用元组或列表来接收多个参数值。这样可以将所有参数打包成一个容器,方便进行操作和传递。

下面是一个案例程序,演示如何使用元组或列表进行可变参数传递:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ParameterPassingDemo {
    // 使用元组作为参数
    public static void processTuple(Object... params) {
        System.out.println("传入的参数个数:" + params.length);
        for (Object param : params) {
            System.out.println("参数值:" + param);
        }
    }

    // 使用列表作为参数
    public static void processList(List<Object> params) {
        System.out.println("传入的参数个数:" + params.size());
        for (Object param : params) {
            System.out.println("参数值:" + param);
        }
    }

    public static void main(String[] args) {
        // 使用元组传递参数
        processTuple(10, "Hello", true);

        // 使用列表传递参数
        List<Object> listParams = new ArrayList<>(Arrays.asList(20, "World", false));
        processList(listParams);
    }
}

运行结果:

传入的参数个数:3
参数值:10
参数值:Hello
参数值:true
传入的参数个数:3
参数值:20
参数值:World
参数值:false

在上述示例中,定义了两个方法 processTupleprocessList 来处理参数。processTuple 方法使用可变参数的形式接收多个参数,而 processList 方法则接收一个列表作为参数。

main 方法中,我分别演示了使用元组和列表来传递参数。首先,在调用 processTuple 方法时直接传递了多个参数,它们会被打包成元组并作为参数传递给方法。然后,创建了一个列表 listParams,并将参数添加到该列表中,最后通过传递该列表来调用 processList 方法。

无论是使用元组还是使用列表,都可以方便地打包多个参数并进行传递。这样做的好处是可以灵活处理不同数量和类型的参数,并且可以在方法内部进行统一的操作。

5.3 使用默认值

可变参数通常与其他参数一起使用,为了提高可变参数的灵活性,在定义函数时可以为可变参数设置默认值。这样,在调用函数时可以选择性地传递额外的参数值,如果没有传递,则使用默认值。

下面是一个Java程序,演示了可变参数与其他参数一起使用时,使用默认值的情况:

public class DefaultValuesExample {
    public static void main(String[] args) {
        // 调用函数时选择性传递额外的参数值
        printValues("Hello", "world");
        printValues("Hello");
    }

    // 定义函数时为可变参数设置默认值
    public static void printValues(String prefix, String... values) {
        System.out.print(prefix + ": ");
        
        if (values.length == 0) {
            System.out.println("No values");
        } else {
            for (String value : values) {
                System.out.print(value + " ");
            }
            System.out.println();
        }
    }
}

输出结果:

Hello: world 
Hello: No values

在上面的例子中,定义了一个方法 printValues ,方法使用了可变参数和其他参数,并为可变参数设置了默认值。

首先,我们调用了 printValues 函数并选择性地传递了额外的参数值。第一次调用时,传递了两个参数 “Hello” 和 “world”,第二次调用时只传递了一个参数 “Hello”。在这两种情况下,函数都会按照传递的参数值进行输出。以上程序演示展示了如何使用默认值来增加可变参数的灵活性。

5.4 缓存计算结果

如果可变参数需要进行复杂的计算或查询操作,可以考虑在函数内部实现缓存机制,以避免重复计算相同的结果。例如,可以使用字典或缓存库来存储已计算的结果,并在每次函数调用时先检查缓存中是否存在对应的结果。

下面是一个使用可变参数时,实现缓存机制的Java示例程序:

import java.util.HashMap;
import java.util.Map;

public class CalculationCache {

    private static Map<String, Integer> resultCache = new HashMap<>();

    public static int calculate(int... numbers) {
        String key = arrayToString(numbers);

        // 检查缓存中是否存在结果
        if (resultCache.containsKey(key)) {
            System.out.println("从缓存中获取结果");
            return resultCache.get(key);
        }

        // 计算结果
        System.out.println("进行复杂计算...");
        int result = 0;
        for (int num : numbers) {
            result += num;
        }

        // 将结果存入缓存
        resultCache.put(key, result);

        return result;
    }

    private static String arrayToString(int[] numbers) {
        StringBuilder sb = new StringBuilder();
        for (int num : numbers) {
            sb.append(num).append(",");
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        System.out.println(calculate(1, 2, 3)); // 进行复杂计算...
                                                // 输出:6

        System.out.println(calculate(1, 2, 3)); // 从缓存中获取结果
                                                // 输出:6

        System.out.println(calculate(4, 5, 6)); // 进行复杂计算...
                                                // 输出:15
    }
}

运行结果:

进行复杂计算...
6
从缓存中获取结果
6
进行复杂计算...
15

在上述示例中,创建了一个名为CalculationCache的类,其中包含了一个静态的resultCache字典用于存储已计算结果。calculate方法接受可变参数,并将参数转化为一个唯一的字符串作为缓存的键。首先,检查该键是否存在于缓存中,如果存在,则直接返回缓存结果;否则,进行复杂计算,在计算完成后将结果存入缓存字典中。

通过运行main方法中的示例调用,我们可以观察到第一次调用时进行了复杂计算,并将结果存入缓存。而后续相同参数的调用直接从缓存中获取结果,避免了重复计算。

综上所述,以上提到的技巧是一些一般性的建议。具体使用时请根据编程语言和实际需求进行适当调整。

6️⃣ 实战:构建动态日志工具

下面是一个Java实战程序,演示了可变参数在构建动态日志工具中的作用,使用 log4j作为日志工具:

import org.apache.log4j.Logger;

public class DynamicLogger {
    private final Logger logger;

    public DynamicLogger(Class<?> clazz) {
        logger = Logger.getLogger(clazz);
    }

    public void log(String message, Object... args) {
        if (logger.isDebugEnabled()) {
            String formattedMessage = formatMessage(message, args);
            logger.debug(formattedMessage);
        }
    }

    private String formatMessage(String message, Object... args) {
        if (args.length > 0) {
            return String.format(message, args);
        }
        return message;
    }

    public static void main(String[] args) {
        DynamicLogger dynamicLogger = new DynamicLogger(DynamicLogger.class);

        String name = "John";
        int age = 28;

        dynamicLogger.log("Hello, %s! Your age is %d.", name, age);
        dynamicLogger.log("Logging without any arguments.");
    }
}

运行结果:

[DEBUG] 2023-06-22 15:38:40,624 method:com.example.DynamicLogger.log(DynamicLogger.java:15)
Hello, John! Your age is 28.
[DEBUG] 2023-06-22 15:38:40,626 method:com.example.DynamicLogger.log(DynamicLogger.java:15)
Logging without any arguments.

在这个示例中,定义了一个DynamicLogger类来构建动态日志工具。在构造函数中,接收一个Class<?>类型的参数,用于指定将要被记录的类。然后,我们使用log4j的Logger.getLogger方法来创建一个logger实例。

DynamicLogger类中有一个log方法,它接收一个格式化的消息字符串和可变参数列表(args)。该方法首先检查是否启用了debug级别的日志记录,然后使用formatMessage方法对消息进行格式化,并最终调用logger实例的debug方法记录日志。

formatMessage方法用于将消息字符串格式化。如果参数列表(args)的长度大于0,则使用String.format方法对消息进行格式化,否则返回原始消息字符串。

main方法中,我们创建了一个DynamicLogger对象,并使用不同的参数调用log方法来演示可变参数的用法。第一次调用时,我们传递了两个参数name和age来格式化日志消息。第二次调用时,我们没有传递任何参数,仅仅记录了静态消息。当然,你可以根据需要在程序中使用更多的日志记录。

🌾 总结

在Java中,可变参数是一项强大的特性,允许我们以更加灵活的方式处理方法参数。通过使用可变参数,我们可以传递任意数量的相同类型的参数给方法,而无需明确指定参数个数。本文探讨了可变参数的概念、优势和缺点、特征以及应用场景、使用方式及技巧以及在实际生产项目中的应用。

可以了解到,可变参数是Java提供的一项强大特性,它为处理不确定数量参数的场景提供了灵活、便捷而且易读的方式。在合适的地方使用可变参数可以提高代码的效率和可维护性。同时,也应当注意可变参数可能带来的性能损耗问题,并在实际使用中进行评估和权衡。


在这里插入图片描述

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

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

相关文章

【Vue3+Ts project】认识 Websocket 以及 socket.io 库

目录 Websocket socket.io Socket.iO 事件名总结&#xff1a; Socket.IO 方法总结 Websocket 作用&#xff1a; WebSocket 仍然提供实时的双向通信功能&#xff0c;使用Vue3 应用程序能够与服务器进行实时数据交换降低延迟和网络开销&#xff1a;相比传统的HTTP请求-响…

scratch lenet(7): C语言计算可学习参数数量和连接数量

scratch lenet(7): C语言计算可学习参数数量和连接数量 1. 目的 按照 LeNet-5 对应的原版论文 LeCun-98.pdf 的网络结构&#xff0c;算出符合原文数据的“网络每层可学习参数数量、连接数量”。 网络上很多人的 LeNet-5 实现仅仅是 “copy” 现有的别人的项目&#xff0c; 缺…

求2的N次幂(C++)解决高精度运算

​&#x1f47b;内容专栏&#xff1a;《C/C专栏》 &#x1f428;本文概括&#xff1a; 计算高精度的2的N次方数字。 &#x1f43c;本文作者&#xff1a;花 碟 &#x1f438;发布时间&#xff1a;2023.6.22 文章目录 ​前言求2的N次方&#xff0c;N ≤ 10000实现思路&#xff1a…

SpringBoot 如何使用 @PathVariable 进行数据校验

SpringBoot 如何使用 PathVariable 进行数据校验 在 SpringBoot 项目中&#xff0c;我们经常需要从 URL 中获取参数并进行相关的数据校验。而 PathVariable 注解就是一种非常方便的方式&#xff0c;可以让我们在方法参数中直接获取 URL 中的参数&#xff0c;并进行数据校验。本…

基于python开发实现数学中各种经典曲线的可视化

今天正好有点时间就想着把之前零星时间里面做的一点小东西整合一下梳理出来&#xff0c;本文的核心目的就是想要基于python来开发实现各种有趣的数学曲线的可视化展示。 笛卡尔心形线 笛卡尔心形线是一种二维平面曲线&#xff0c;由法国数学家笛卡尔在17世纪提出。它得名于其…

基于springboot+Redis的前后端分离项目(三)-【黑马点评】

&#x1f381;&#x1f381;资源文件分享 链接&#xff1a;https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwdeh11 提取码&#xff1a;eh11 优惠券秒杀 优惠券秒杀1 -全局唯一ID2 -Redis实现全局唯一Id3 添加优惠卷4 实现秒杀下单5 库存超卖问题分析6 优惠券秒杀-一人一单…

Spring Boot 异常处理的主要特点

Spring Boot 异常处理的主要特点 在 Web 应用程序中&#xff0c;异常处理是非常重要的一部分。在 Spring Boot 中&#xff0c;异常处理是非常简单和灵活的。本文将介绍 Spring Boot 异常处理的主要特点&#xff0c;并提供一些示例代码来帮助您更好地理解。 异常处理的主要特点…

王道计算机网络学习笔记(1)——计算机网络基本知识

前言 文章中的内容来自B站王道考研计算机网络课程&#xff0c;想要完整学习的可以到B站官方看完整版。 一&#xff1a;计算机网络基本知识 1.1.1&#xff1a;认识计算机网络 计算机网络的功能 网络把许多计算机连接在一起&#xff0c;而互联网则将许多网络连接在一起&#x…

第一章JavaScript简介

第一章JavaScript简介 js是一门,高级,动态,解释型编程语言 每种语言都必须有一个平台或标准库,用于执行包括基本输入和输出在内的基本操作.核心js语言定义了最小限度的API,可以操作数组,文本,数组,集合,映射等,但不包括任何输入输出的功能.输入和输出(以及更加复杂的特性,如联…

基于Servlet实现分页查询

Servlet JSPJSTL MySQLBootstrap 等技术实现分页查询功能。 所用工具&#xff1a;IDEA 2022.3.3 Navicat Tomcat 等。 本文目录 一&#xff1a;运行效果 二&#xff1a;代码详解 &#xff08;1&#xff09;index.jsp &#xff08;2&#xff09;PageBean &#xff08…

图解操作系统笔记

硬件基础 CPU是如何执行程序的&#xff1f; 程序执行的基本过程 第一步&#xff0c;CPU 读取「程序计数器」的值&#xff0c;这个值是指令的内存地址&#xff0c;然后 CPU 的「控制单元」操作「地址总线」指定需要访问的内存地址&#xff0c;接着通知内存设备准备数据&#…

python:并发编程(十七)

前言 本文将和大家一起探讨python并发编程的实际运用&#xff0c;会以一些我实际使用的案例&#xff0c;或者一些典型案例来分享。本文使用的案例是我实际使用的案例&#xff08;中篇&#xff09;&#xff0c;是基于之前效率不高的代码改写成并发编程的。让我们来看看改造的过…

excel数据的编排与整理——行列的批量处理

excel数据的编排与整理——行列的批量处理 1 一次性插入多行多列 1.1 插入连续行 1.1.0 题目内容 1.1.1 选中插入的位置➡按住shift键➡往下选中2行 1.1.2 鼠标右击➡点击插入 1.1.3 插入后的效果 1.2 插入不连续行 1.2.0 题目内容 1.2.1 按下ctrl键➡选中插入的位置,需要插…

7.4_1B树(二序查找树BST的升级版)

如果需要查找的值比节点小&#xff0c;会向左子树方向查找&#xff0c;如果比节点值大&#xff0c;会向右子树方向查找 拓展为5叉的形态 5叉排序树的定义 num是这个节点中真实存在的节点个数 那么一个节点中 最少有1个关键字&#xff0c;两个分叉 最多有4个关键字&#xff0c…

数据结构:二叉树详解

目录 概念&#xff08;在做习题中常用的概念&#xff09; 两种特殊的二叉树 二叉树的性质 二叉树的遍历&#xff08;重点&#xff09; 如上图&#xff1a; 二叉树的构建&#xff08;代码表示一颗二叉树和一些操作二叉树的方法&#xff09; 二叉树的oj习题讲解&#xff0…

代码审计-Java项目Filter过滤器CNVD分析XSS跨站框架安全

文章目录 Demo-Filter-过滤器引用Demo-ST2框架-组件安全CNVD-Jeesns-XSS跨站绕过CNVD-悟空CRM-Fastjson组件 Demo-Filter-过滤器引用 Filter&#xff1a;Javaweb三大组件之一(另外两个是Servlet、Listener) 概念&#xff1a;Web中的过滤器&#xff0c;当访问服务器的资源时&am…

编程语言的优劣评选标准与未来发展趋势——探索最佳编程语言选择

编程语言的优劣评选标准与未来发展趋势——探索最佳编程语言选择 评判标准不同编程语言的优点与缺点分析对编程语言未来发展的猜测和未来趋势 &#x1f495; &#x1f495; &#x1f495; 博主个人主页&#xff1a; 汴京城下君–野生程序员&#x1f495; &#x1f495; &#x…

编程输出三位数的水仙花数

目录 题目 分析思路 代码 题目 编程输出三位数的水仙花数 标准的 水仙花数 就是三位数&#xff0c;即将三位数的个位&#xff1b;十位&#xff1b;百位取出来&#xff0c;分别三次方相加&#xff0c;若个位&#xff1b;十位&#xff1b;百位三次方相加与原来的三位数相等&a…

模拟电路系列文章-频率响应的描述

目录 概要 整体架构流程 技术名词解释 技术细节 1.为什么受频率的影响 2.频率响应 小结 概要 提示&#xff1a;这里可以添加技术概要 电容和电感是储能元件&#xff0c;对不同频率的交流信号&#xff0c;它们具有不同的感抗或者容抗。虽然它们不消耗功率&#xff0c;但同电阻一…

【PHP】文件写入和读取详解

一&#xff0e;实现文件读取和写入的基本思路&#xff1a; 1&#xff0e;通过fopen方法打开文件&#xff1a;$fp fopen(/*参数&#xff0c;参数*/)&#xff0c;fp为Resource类型 2&#xff0e;进行文件读取或者文件写入操作&#xff08;这里使用的函数以1中返回的$fp作为参数…