Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字符串[]和字符串。。。(Var args)在内部工作时是否相同?_Java_Arrays_Variadic Functions - Fatal编程技术网

Java 字符串[]和字符串。。。(Var args)在内部工作时是否相同?

Java 字符串[]和字符串。。。(Var args)在内部工作时是否相同?,java,arrays,variadic-functions,Java,Arrays,Variadic Functions,以上代码不可编译!编译器说这些是重复的方法。 那么使用stringarray或stringvar参数的意思完全相同吗 它们是如何在内部实现的?String。。。aaa就像拥有String[]aaa 我假设第二个函数后面的分号是一个输入错误…是的,它是相同的 您可以阅读以下文章: 在一个数组中必须传递多个参数仍然是正确的,但是varargs特性会自动并隐藏该过程 [vararg]属性指定该方法采用数量可变的参数。要完成此操作,最后一个参数必须是包含所有剩余参数的变量类型的安全数组: varargs

以上代码不可编译!编译器说这些是重复的方法。 那么使用stringarray或stringvar参数的意思完全相同吗


它们是如何在内部实现的?

String。。。aaa
就像拥有
String[]aaa

我假设第二个函数后面的分号是一个输入错误…

是的,它是相同的

您可以阅读以下文章:

在一个数组中必须传递多个参数仍然是正确的,但是varargs特性会自动并隐藏该过程

[vararg]
属性指定该方法采用数量可变的参数。要完成此操作,最后一个参数必须是包含所有剩余参数的变量类型的安全数组:

varargs语法基本上允许您指定有可能的参数,对吗?他们可能在那里,也可能不在那里。这就是三个点的目的。调用该方法时,可以使用或不使用这些参数来调用它。这样做是为了避免将数组传递给方法

看看:

格式-格式字符串语法中描述的格式字符串

args-由格式字符串中的格式说明符引用的参数。如果参数多于格式说明符,则会忽略额外的参数。参数的数量是可变的,可能为零。参数的最大数量受到Java虚拟机规范定义的Java数组的最大维度的限制。空参数的行为取决于转换


是的,它们是相同的,因为当您使用省略号(String…)调用方法时,它会转换为字符串数组。

From

变量方法
函数(Object…args)
的基本类型是
函数(对象[]参数)
。Sun以这种方式添加了varargs以保护 向后兼容性


所以,正如所有其他答案所说,是的,它们是一样的

幕后的编译器实际上将var args方法转换为带有数组输入的方法。
这就是为什么可以使用数组作为输入重载var args方法的原因,因为在编译之后,它们将是相同的

是的,两者都是一样的。。。
只要阅读本网站,您就会知道它们实际上是相同的,只是编译器不会接受varargs,除非它是最后一个参数,并且它不允许您将多个参数传递给数组

public PrintStream printf(String format, Object ... args)
{
     return format(format, args);
}

在调用一个方法时,它不关心返回类型,它将考虑方法名称、参数数量和参数类型和参数顺序。在这里,您指定了一个名称相同的参数相同的方法。BCOZ在VAR-ARG的情况下,如果调用具有2个参数的方法,将执行相同的方法,如果我们用3个参数调用方法,它将调用相同的方法。 在这里,如果我们调用某个东西(字符串[]a)和某个东西(字符串…aaa),将调用相同的方法。bcoz我们可以用var arg替换数组,那么应该调用哪个方法就会出现混乱。然后就会出现方法歧义。这就是为什么它显示重复的方法


在这里,如果我们将数组传递给var-arg参数方法,它将被执行。在内部,它将var-args转换为一维数组。

为什么在函数末尾有分号?不确定这是否符合回答条件,或者它是否描述了您刚刚遇到的问题。
[vararg [, optional-attributes]] return-type function-name(
[optional-param-attributes] param-list,
SAFEARRAY(VARIANT) last-param-name);
final public class Main
{
    private void show(int []a)
    {
        for(int i=0;i<a.length;i++)
        {
            System.out.print(a[i]+"\t");
        }
    }

    private void show(Object...a)
    {
        for(int i=0;i<a.length;i++)
        {
            System.out.print(a[i]+"\t");
        }

        System.out.println("\nvarargs called");
    }

    public static void main(String... args)
    {
        int[]temp=new int[]{1,2,3,4};            

        Main main=new Main();
        main.show(temp);
        main.show();         //<-- This is possible.
    }
}
public PrintStream printf(String format, Object ... args)
{
     return format(format, args);
}
public void methodA(int... ints, int a); // doesn't compile
public void methodA(int[] ints, int a); // compiles

public void methodB(int... ints); // compiles
public void methodC(int[] ints); // compiles

methodB(1); // compiles
methodB(1,2,3,4); // compiles
methodC(1); // doesn't compile
methodC(1,2,3,4); // doesn't compile