2013-06-03 63 views
4
package com.example.mapdemo; 

import android.app.ListActivity; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ListAdapter; 
import android.widget.ListView; 

import com.example.mapdemo.view.FeatureView; 

/** 
* The main activity of the API library demo gallery. 
* <p> 
* The main layout lists the demonstrated features, with buttons to launch them. 
*/ 
public final class MainActivity extends ListActivity { 

    /** 
    * A simple POJO that holds the details about the demo that are used by the List Adapter. 
    */ 
    private static class DemoDetails { 
     /** 
     * The resource id of the title of the demo. 
     */ 
     private final int titleId; 

     /** 
     * The resources id of the description of the demo. 
     */ 
     private final int descriptionId; 

     /** 
     * The demo activity's class. 
     */ 
     private final Class<? extends FragmentActivity> activityClass; 

     public DemoDetails(
       int titleId, int descriptionId, Class<? extends FragmentActivity> activityClass) { 
      super(); 
      this.titleId = titleId; 
      this.descriptionId = descriptionId; 
      this.activityClass = activityClass; 
     } 
    } 

有兩件事我覺得我需要更好地理解何時涉及到這段代碼。首先,我試圖確定的確切含義:使用super();在Java中

private final Class<? extends FragmentActivity> activityClass; 

其次,我很好奇什麼是用super()調用;因爲當定義DemoDetails時,它被定義爲:

private static class DemoDetails { 

那麼在那一點上沒有擴展,所以超級引用了什麼?使用

<? extends > 

我從來沒有見過。

在此先感謝...

+0

Java中的所有類都是從'Object'派生的,所以在這種情況下'super()'已經過時了,因爲構造函數已經生成了,所以這行可能在那裏。 –

+0

@MarcoForberg:如果'super()'在這裏沒有被明確地調用,它會被隱式調用。 – jlordo

+0

@MarcoForberg:我很確定;)參見Java語言規範,第12.5節創建新類實例第3點,[鏈接](http://docs.oracle.com/javase/specs/jls/se7/html /jls-12.html#jls-12.5) – jlordo

回答

2
private final Class<? extends FragmentActivity> activityClass; 

聲明一個名爲activityClass場是privatefinal(無重assingment)(僅在其中它聲明的類中可見)。它的類型是Class<? extends FragmentActivity>(它是泛型類型Class<T>的參數化類型或(類型)實例,其中T是一個類型參數)。當使用泛型類型時,它們被稱爲參數化類型,併爲類型參數提供一個類型參數。這裏所述類型參數是? extends FragmentActivity(這實際上是一個wildcard with an upper bound,這裏結合上恰好是FragmentActivity

這意味着activityClass可以指Class實例代表任一類FragmentActivity本身或任何的它的子類(例如FragmentActivity.class)。

1

私營,這意味着這個變量可以一次性的值賦給它不能改變不能被此類 final-外部訪問。

所以一個私有的最終類是一個只能在這個文件中訪問的類,不能被分配一個新的值 - 它是一個常量。

super-每個類擴展Object。只有對象在層次結構中沒有父項。所以super()調用Object()。這不是必需的,可能是由不知道的人添加的,或者該班曾經有過父母並且被重構過,但是該行被錯過了。

<? Extends FragmentActivity> - 這意味着該類是一個通用的。它的一些函數可以處理大量的對象,我們將在實例化類時指定它。現在這是一個? Extends FragmentActivity部分意味着只有擴展FragmentActivity的類纔是有效的值。那麼顯而易見的問題是爲什麼不直接讓它成爲FragmentActivity呢?使用通用的限制所有的?是相同的類型,而採用基類可以允許它們是混合類型 - 更具體。

編輯:最初錯過了一個資本,把最終的意義,類,而不是類。固定。

+2

那私人的最後thingie是一個'Class'對象,不是一個單獨的'class'定義;) –

+0

啊,錯過了首都。我的錯。 –

0
private final Class activityClass; 

將擴展你的類停止其他類。你也可以做到這一點與方​​法,使你的方法不會被覆蓋。 http://docs.oracle.com/javase/tutorial/java/IandI/final.html提供更多信息

super(); 

將調用父類的構造(在這種情況下是,你擴展了ListActivity) http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

+0

super()在內部類的構造函數中調用。它與ListActivity無關。 – britzl

0

好吧,讓我們開始吧:

private final Class<? extends FragmentActivity> activityClass; 

的DemoDetails類需要Class作爲構造函數的參數。該類必須是FragmentActivity類型或其子類。傳遞Class引用有幾個用途,其中一個是可以使用activityClass.newInstance()創建新實例。另一種方法是使用isAssignableFrom()

其次我很好奇,什麼是被稱爲超做runtime checks of types()

這完全沒有影響。超類(Object)中沒有任何事情發生,但總是調用super()是個好主意。特別是如果你在稍後階段決定讓DemoDetails從其他東西繼承。

0
private final Class<? extends FragmentActivity> activityClass; 

這條線的含義是activityClass是私有和最終只能容納FragmentActivity的FragmentActivity的參考變量或所有的子類。

super(); 

這將調用父類即的構造ListActivity.If你不寫這個代碼,編譯器會自動附加在.class文件的代碼。

<? extends temp> 

這measns,此容器能容納臨時或子類的溫度only.If一次嘗試的參考變量傳遞其他ref.var,一個編譯時間錯誤occur.So,它基本上是對限制引用變量的類型。

0

問題1.沒有延伸,所以超級引用什麼?

Ans: - 每個類都是java類對象的子類,默認爲 .So Object類的空構造函數先被調用,然後被子類構造函數調用。

問題2.private final Class activity類的含義?

答案: - 即宣告最終不能被繼承 .private類的類是可以相同類文件由其他類文件內的相同不同訪問的類包。

這是什麼<? extends >

ANS-它是在java.same在C++模板泛化FPGA實現。

+0

問題2中的問題相同:它是'Class' not'class' –

1

要明白說明書

private final Class<? extends FragmentActivity> activityClass; 

和相應的構造函數的參數,請記住,ObjectgetClass()方法:

public final Class<?> getClass(); 

另外,如果你有一個名爲類型(不匿名子類),那麼你可以使用.class

String s = "a string"; 
assert s.getClass().equals(String.class); 
// String.class is a Class<String> object. 

有很多地方你使用這種機制。反思是其中之一,但很少見。 Log4J記錄器是另一個。

聲明一個類的任意對象的最安全的方式是:

Thing t = ...; // assume not null. 
Class<? extends Thing> clazz = t.getClass(); 

畢竟,t可能是Thing一個子類的實例,甚至一個匿名子類。該表達意味着clazzClass對象,並且clazz的特定類型變量是Thing的一些但不一定已知的子類,或者可能僅僅是Thing本身。

回到原始表達式,activityClassFragmentActivity或其某些子類型的類對象。如果程序有一個0參數的構造函數,程序可以用Class.newInstance()構造它的一個實例。