2011-02-26 117 views
6

这应该是一个相当简单的问题来回答。我环顾四周,找不到任何有关此语法的主题,并且“...”在Google上搜索它很困难。我正在研究一个简单的测试应用程序,用于将数据库文件从未受保护的Android手机上的受保护位置复制到SD卡上的一个位置,我可以通过该位置查看sqlite3 database viewing tool。我知道这似乎是一种迂回的做事方式,但模拟器拒绝在我的上网本上打开,所以我现在用我的手机来测试开发。语法“final String ... args”是什么意思/做什么?

该代码已被写入,所以我borrowing it from here并适应它到我的代码。我遇到的这个代码小片段:

private class ExportDatabaseFileTask extends AsyncTask<String, Void, Boolean> { 
    private final ProgressDialog dialog = new ProgressDialog(ManageData.this); 

    // can use UI thread here 
    protected void onPreExecute() { 
    this.dialog.setMessage("Exporting database..."); 
    this.dialog.show(); 
    } 

    // automatically done on worker thread (separate from UI thread) 
    protected Boolean doInBackground(final String... args) { 

我从来没有见过的说法final String... args之前。这意味着什么?

谢谢! Moscro

回答

11

Java中参数的省略号意味着变量类型。所以,在你的情况下,...意味着你可以传递任意数量的String参数给doInBackground方法。

所以,你可以调用这个方法doInBackground("String1", "String2", "String3")doInBackground("String1")doInBackground("String1", "String2", "String3", "String4")或任何其他形式。

这里参见http://download.oracle.com/javase/1.5.0/docs/guide/language/varargs.html

最终参数的类型后的三个时期表明最后一个参数可以作为阵列或者作为参数的序列进行传递。可变参数只能在最后的参数位置使用。鉴于MessageFormat.format新的可变参数的声明,上面的调用可以通过以下短,甜调用

final有它的通常含义进行更换。顺便说一句,这个特性在Java5或更新版本中可用。

参见:http://www.developer.com/java/other/article.php/3323661

由于上述两个环节提到了,它只不过是加糖阵列。基本上,当你定义myMethod(T... vararg)时,Java认为它是myMethod(T[] vararg)。当你打电话给myObj.myMethod(t1, t2, t3, ..., tn)时,Java将它传递给myObj.myMethod(new T[]{t1, t2, t3, ..., tn})

+0

非常好,谢谢大家的帮忙! – moscro 2011-02-26 05:27:29

4

final意味着args不能被重新分配在doInBackgroundString...是“vararg”。您可以将任意数量的String对象传递给doInBackground方法。

String...确实是String[] - 它实际上是一个String的数组,可以像这样访问。