2013-05-28 101 views
4

創建抽象類的URLConnection或HttpURLConnection類的一個對象,我看到的教程下面的代碼:在Java中

URLConnection connection = new URL("http://example.com").openConnection(); 

這怎麼可能? API說URLConnection(也是子類HttpURLConnection)是一個抽象類。但是抽象類不能被實例化。我還看到了其他教程(例如)此代碼:

URL url = new URL("http://java-tutor.com/index.html"); 
URLConnection con = url.openConnection(); 

爲什麼沒有「新」?對我來說這很奇怪,所以有人可以向我解釋這一點。

+0

'url.openConnection()'是一種返回'URLConnection'實現的方法。這個實現不在java API中,而在Sun類中。使用調試器,您可能會看到它。 –

回答

3
openConnection(); 

創建實現URLConnection類的一個實例(sun.net.www.protocol.http.HttpURLConnection @Credit去索蒂里奧斯)。

基於javadoc

如果URL的協議(如HTTP或JAR),存在一個公共,專用URLConnection子屬於以下包之一或其子之一:java.lang中, java.io,java.util,java.net,返回的連接將是該子類的。例如,對於HTTP,將返回HttpURLConnection將返回,對於JAR,將返回JarURLConnection。

+1

'HttpURLConnection'也是抽象的。它比這更深入,但我找不到實現類。 –

+0

@SotiriosDelimanolis:你說的沒錯。我的意思是,將返回一些類型爲URLConnection的實現類,這就是爲什麼URLConnection == .... openConnection()是有效的調用。 – kosa

+1

我很確定它是'sun.net.www.protocol.http.HttpURLConnection'。使用IDE時,您會看到'訪問限制:由於對所需庫C:\ Program Files \ Java \ jre7 \ lib \ rt.jar的限制而無法訪問類型HttpURLConnection –

1

首先,你不要實例URLConnectionURL在:

URLConnection connection = new URL("http://example.com").openConnection(); 

URLConnection是可變類型(可abstract甚至interface),URL是你實例化的具體類。

關於沒有新詞,openConnection()返回URLConnection對象,所以你不需要自己創建一個。

+0

是的,我知道openConnection()返回URLConnection,但URLConnection是抽象的,我發現這很奇怪。 –

1

URL是一個工廠,通過一個方案創建基於URLConnection(如果內存正確地爲我服務)。您可以有HttpsURLConnectionHttpURLConnection

1

URLConnection確實是一個抽象類。它不能被實例化。但是,對於類結構中的每個抽象類,必須有一個具體的子類(可能有幾個級別被刪除),即可以被實例化。

URL.openConnection()正在向您返回其中一個子類。如果你喜歡,你可以用調試器來驗證。 URLConnection是您稱爲「con」的引用的類型,而不是該引用引用的對象的類型。