跳至主要內容

Java

LincZero大约 2 分钟

Java

目录

函数式编程

Java函数都在类中,详见类中函数一节

在类外定义方法

与C++不同

  • Java / C#
    • Java函数都在类中
    • 这是纯面向对象语言的通用标准,C#也是如此: 不允许在类外定义变量、方法、事件等,强调一切皆是对象的思想。 即便是主函数的main,也必须定义在某个类里面。
  • C++
    • 允许在类外定义变量、方法、事件等

可变的参数数量

在Java SE 5.0以前的版本中,每个Java方法都有固定数量的参数。 然而,现在的版本提供了可以用可变的参数数量调用的方法(有时称为“变参”方法)

举例 - printf

  • 使用

    System.out.printf("%d", n);
    // 和
    System.out.printf("%d %s", n, "widgets");
    // 都是调用同一个方法
    
  • 定义

    public class PrintStream
    {
        // 这里的省略号...是Java代码的一部分,它表明这个方法可以接收任意数量的对象(除fmt参数之外)
        public PrintStream printf(String fmt, Object... arg) { return format(fmt, args); }
    }
    

举例 - 计算若干个数值的最大值

// 定义
public static double max(double... values)
{
    double largest = Double.NEGATIVE_INFINITY;
    for (double v: values) if (v>largest) largest = v;
    reutrn largest;
}

// 使用
double m = max(3.1, 40.4, -5);  // 编译器将new double[]{3.1,40.4,–5}传递给max方法

对旧方法扩展

可以将已经存在且最后一个参数是数组的方法重新定义为可变参数的方法,而不会破坏任何已经存在的代码

例如,MessageFormat.format在Java SE 5.0就采用了这种方法。将main方法声明为下列形式:

public static void main(String... args){}

与C++不同

可变参数类型

  • Java

    • 可变参数类型,有时称为“变参”方法

      public static void main(String... args){}
      public PrintStream printf(String fmt, Object... arg){}
      
  • TypeScript

    • 叫剩余参数,参考 https://www.tslang.cn/docs/handbook/functions.html

      function buildName(firstName: string, ...restOfName: string[]) {
        return firstName + " " + restOfName.join(" ");
      }
      
      let employeeName = buildName("Joseph", "Samuel", "Lucas", "MacKinzie");
      
  • Python

    • Python的可变参数有两种,一种是列表类型,一种是字典类型

      # a接受一个常规参数,*args 接收的是一个tuple,**kwargs 接收一个dict
      def ff(a,*b,**c):
          print(a)  # 1232
          print(b)  # (4, 5, 6, 7, 8)
          print(c)  # {'ss': 'sadf', 'xx': 'fff', 'ww': 'asdf'}
      
      if __name__ == '__main__':
          ff(1232,4,5,6,7,8,ss="sadf",xx="fff",ww="asdf")
      
  • C++

    • 参考

      • https://blog.csdn.net/qychjj/article/details/98532841(含原理)
      • https://www.bilibili.com/read/cv13120050
    • 可变参数函数 - ...,也叫 VA函数(variable argument function)

      void func1(unsigned int argsNum, ...) {}
      
    • 可变参数宏 - __VA_ARGS__

      // 略
      
    • 可变参数模板 - initializer_list

      // 略