PDA

View Full Version : استفاده از کلاس انتزاعی URLConnection



khajavi
چهارشنبه 24 بهمن 1386, 08:02 صبح
توی java doc6 این کلاس را به صورت زیر معرفی کرده:


public abstract class URLConnection
extends Object
کلاسی که انتزاعی باشه قابل تولید شدن نیست. پس چرا برای این کلاس Constructor تعریف کرده؟

Constructor Detail
URLConnection

protected URLConnection(URL url)

طبق Constructor بالا باید این کلاس را به صورت زیر ایجاد کنم:

URL u = new URL(args[i]);
URLConnection = new URLConnection(u);
در صورتی که کامپایلر ایراد می گیرد.

در کتاب O'Reily I/O به صورت زیر یک کانکشن ساخته:

URL u = new URL(args[i]);
URLConnection uc = u.openConnection();

من که به کلی گیج شدم. میشه دقیقا بگید آخرین سطر بالایی چه کاری انجام میده و الان چه اتفاقی افتاده؟
در ضمن یک سوال دیگه هم دارم:
در ادامه ی دوسط آخر بالا کد های زیر هم آمده بود که باز هم متوجه نشدم چه اتفاقی افتاده:
uc.connect();
InputStream in = uc.getInputStream();

javaphantom
چهارشنبه 24 بهمن 1386, 10:14 صبح
[QUOTE=khajavi;466623]توی java doc6 این کلاس را به صورت زیر معرفی کرده:


public abstract class URLConnection
extends Object
کلاسی که انتزاعی باشه قابل تولید شدن نیست. پس چرا برای این کلاس Constructor تعریف کرده؟[CODE]

قابل instance گرفتن یا همان new کردن حافظه نیست ولی قبول داری که خودش به تنهایی یک کلاس حساب می شه و می تونه یک کلاس معمولی از اون ارث بگیره.

نکته در صورتی که در کلاسی ما constructor تعریف نکنیم بصورت پیشفرض constructor برای آن تعریف می شود در صوتی که بخواهیم چند constructor داشته باشیم باید این method را overload کنیم. در صورتی که بخواهیم یک constructor داشته باشیم که بصورت overload باشد می توانیم ولی باید بدانیم که دیگر method معمولی آن را نداریم و هنگامی که می خواهیم از آن کلاس استفاده کنیم باید حتما constructor ی را صدا کنیم که overload کرده ایم.
در کلاسی که شما نشان داده اید یک constructor بیشتر ندارد که آن هم overload شده است یعنی آرگومان دارد. چون همین construcotr می باشد دیگر constructor وجود ندارد پس هر کلاسی که آز آن ارث می گیرد بصورت پیشفرض این constructor را دارد.
این constructor ی که موجود است که overload هم شده مقدار آرگومان آن از نوع کلاسی به نام URL می باشد. خود این کلاس 6 constructor ی دارد که همگی overload شده اند برای مثال
URL(String s)
ffffffffffffffffffffffffffffffffffffffffffffffff
در کلاس URLو کلاس URLConnection هیچ گونه constructor معمولی یعنی
URL() or URLConnection()
zzzzzzzzzzzzzzzzzzzzzzzzzzzz
وجود ندارد پس همانطور که گفته شده ماهم نمی توانیم از آنها استفاده کننیم.

javaphantom
چهارشنبه 24 بهمن 1386, 10:22 صبح
طبق Constructor بالا باید این کلاس را به صورت زیر ایجاد کنم:

URL u = new URL(args[i]);
URLConnection = new URLConnection(u);
در صورتی که کامپایلر ایراد می گیرد.
;

دوست عزیز این args[i] رو از کجا آوردی اصلا کدوم constructor
URL همچین مقداری رو یعنی array رو توی آرگوماناشون قبول می کنند. مشخص که ایراد می گیره

javaphantom
چهارشنبه 24 بهمن 1386, 10:37 صبح
در کتاب O'Reily I/O به صورت زیر یک کانکشن ساخته:

URL u = new URL(args[i]);
URLConnection uc = u.openConnection();

من که به کلی گیج شدم. میشه دقیقا بگید آخرین سطر بالایی چه کاری انجام میده و الان چه اتفاقی افتاده؟
در ضمن یک سوال دیگه هم دارم:
در ادامه ی دوسط آخر بالا کد های زیر هم آمده بود که باز هم متوجه نشدم چه اتفاقی افتاده:
uc.connect();
InputStream in = uc.getInputStream();

دوست عزیز می دونی چرا
1
برای اینکه 100% در method زیر ساخته شده یعنی به صورت
public static void main(String[] args){
URL u = new URL(args[i];
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
دیدی اون args که شما می بینی ازش استفاده کرده مقداری است که شما هنگامی که برنامه را می خواهید ران کنید به آن می دهید. یعنی چی؟
برای مثال
در OS هایی که شما می تواند command به زنید مثل linux یا همان dos قدیم حتی همی windows عقب مونده
برای مثال می خواهید فلدر عوض کیند در windows از طریق command
دستور cd که همان change directory می باشد یک فایل exe می باشد که نیاز به یک رشته دارد یعنی مثلا همان نام فلدر یا چند فلدر که با علامت \ ازهم جدا می شوند
مثلا
cd c:\myjava\test\MyClass.java
در مثال بالا cd دستور می باشد و رشته جلوی آن مقداری است که شما به آن می دهید.
لعنت بر هرچی IDE هست که نمی زاره آدم چیز یاد بگیره.
public static viod main(String[] arg)
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz zzzzz
شما تا بحال از خود نپرسیدید که چرا همیشه main باید یک رشته از نوع آرایه در آرگومان خود داشته باشد.
مطمعنا نه چون با IDE کار می کنید IDE برای کسی هست که مفهوم رو بدونه نه برای یک کارآموز
اون رشته ای که بصورت آرایه هست در مثالی مثل همان دستور cd کار می کنه و یا همان مثالی که گفتید کتاب زده شما موقعی که دارید دستور را اجرا می کنید یک رشته به آن اضافه می کنید که همان URL یا مسیر است که باید در constructor خود کلاس URL فرستاده شود و چون در متدود main صورت گرفته args معنی پیدا کرده است
خوبه که داری کتاب می خونی این IDE هم بریز دور تا conceptual موضوع رو بفهمی
code زدن کار بدون مفهوم و ساختار زبان نتیجش می شه همینی که می بینی
چاکس

zer0cool
چهارشنبه 24 بهمن 1386, 11:08 صبح
constructor یک متد هستش که هم نام کلاس می باشد ولی مقدار برگشتی نداره و فقط جهت initialize کردن متغیرهای موجود در کلاس هستش. و زمانی که از کلاس یک instanc میگیریم قبل از اینکه new operator کامل بشه زمانیکه یک object ساخته میشه بلافاصله constructor صدا زده میشه اگر ما قبلا constructor تعریف نکرده باشیم از default constructor استفاده میکنه.
ما زمانی از abstrac class یا abstrac method استفاده میکنیم که نیاز داریم اونها رو override کنیم چون نمیدونیم اونها قراره چه کاری انجام بدن و در subclass میخواهیم کارشون رو تعریف کنیم.
ولی واقعا منظور از این قسمت که علامت گذاشتم رو نمیدونم؟!

URL u = new URL(args[i]);
URLConnection uc = u.openConnection();

http://java.sun.com/javame/reference/apis/jsr219/java/net/class-use/URLConnection.html

javaphantom
چهارشنبه 24 بهمن 1386, 16:19 عصر
constructor یک متد هستش که هم نام کلاس می باشد ولی مقدار برگشتی نداره و فقط جهت initialize کردن متغیرهای موجود در کلاس هستش. و زمانی که از کلاس یک instanc میگیریم قبل از اینکه new operator کامل بشه زمانیکه یک object ساخته میشه بلافاصله constructor صدا زده میشه اگر ما قبلا constructor تعریف نکرده باشیم از default constructor استفاده میکنه.
ما زمانی از abstrac class یا abstrac method استفاده میکنیم که نیاز داریم اونها رو override کنیم چون نمیدونیم اونها قراره چه کاری انجام بدن و در subclass میخواهیم کارشون رو تعریف کنیم.
ولی واقعا منظور از این قسمت که علامت گذاشتم رو نمیدونم؟!

URL u = new URL(args[i]);
URLConnection uc = u.openConnection();

http://java.sun.com/javame/reference/apis/jsr219/java/net/class-use/URLConnection.html

شما اگر به آخرین نوشته من توجه می کردید اون موقع می فهمیدی که توی این کد چه اتفاقی افتاده

javaphantom
چهارشنبه 24 بهمن 1386, 16:38 عصر
برای روشنتر شدن مطلب به دو مثال می پردازم
این دو مثال را خارج از یک محیط IDE اجرا کنید و نتایج را مقایسه کنید
مثال یک
public class TestOne {
public Test(String s) {
System.out.println(s);}
public static void main(String[] arg) {
new TestOne("Hello World");
{
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz zzzzzzzzzzzzzzzzzzz
هنگامی که این برنامه رو کامپایل کنید به راحتی پیغام مزبور چاپ می شه. اما مثال دوم
public class TestTwo{
public TestTwo(String s) {
System.out.println(s);
{
public static void main(String[] arg) {
new TestTwo(arg[0]);
{
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz zzzzzzzzz
اما برای اجرای این برنامه بعد از کامپایل دیگر مثل سابق عمل نمی کنیم. این بار برای اینکه خروجی داشته باشیم باید arg[0]
d که در آرگومان می باشد مقدار دهی شود چگونه در هنگام اجرا این چنین عمل می کنید
java TestTwo Hello World
حال پیغامی که خود شما حین runtime دادین چاپ می شود که همان Hello World است