JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java 新手區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 我想請問一下建構子的問題
lan





發文: 4
積分: 0
於 2004-04-18 12:26 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我最近剛開始看到建構子的部分
我覺得奇怪的是 他跟方法非常的類似
因為我的書並沒有多做說明
我不知道他跟方法有什麼明顯的區別[除了命名]
特別是在功用上
很希望能有高手能我解答一下
建構子到底是要幹麻的呢?

在此先感謝不吝指教的各位
謝謝


reply to postreply to post
作者 Re:我想請問一下建構子的問題 [Re:lan]
yingssu





發文: 111
積分: 1
於 2004-04-18 13:38 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
建構子是物件建立時用來輔助物件內部的狀態部署所使用的
與MOTHED不同有
1.不需要回傳值
2.只會在物件建立時執行一次
如果完全沒有建立任何建構子,將會使用預設的建構子className(){super()}
但是有建立建構子時,無論是怎樣不同的參數,都將會以妳所建立的為主,所以必須考慮可能使用的方式
這樣短短的說明該不是很完備,但是應該可以開一個頭,你可以搜尋論壇內的相關文章,應該會更清楚。


reply to postreply to post
作者 Re:我想請問一下建構子的問題 [Re:lan]
lan





發文: 4
積分: 0
於 2004-04-18 14:22 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
原來如此
那我大概懂了
他就是輔助物件建立物件使性的初始化
這樣說應該沒錯吧
謝謝囉


reply to postreply to post
作者 Re:我想請問一下建構子的問題 [Re:lan]
wttmama

學習,就像睡覺般寧靜



發文: 71
積分: 0
於 2004-04-19 01:32 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
lan wrote:
我最近剛開始看到建構子的部分
我覺得奇怪的是 他跟方法非常的類似
因為我的書並沒有多做說明
我不知道他跟方法有什麼明顯的區別[除了命名]
特別是在功用上
很希望能有高手能我解答一下
建構子到底是要幹麻的呢?

在此先感謝不吝指教的各位
謝謝

簡單的講,方法是拿來用的,你可以在執行階段時,一直拿來用
而建構子,則是物件建立的時候,第一件事要做的便是物件的初始化,因此,建構通常是放物件初始化時,所必要的資訊。
就像你自訂了一個People的類別
1
2
3
4
5
6
7
8
class People{
  String name;
  int age;
  public People(){
  name = "john";
  age = 18;
  }
}

而你要宣告一個People的物件p1時便用下列語法產生
1
People p1 = new People();

這時產生出來的p1物件便包含了你設在建構子裡的資訊
因此
p1.name是john
p1.age是18
不管你產生了幾個Pelple的物件,那物件所能有的資訊,將不能改變
因此,你可以自訂建構子,傳入你想傳的參數作為建立物件時的參考資訊
所以我們再重新定義一下People類別為
1
2
3
4
5
6
7
8
class People{
  String name;
  int age;
  public People(String n,int a){
    name = n;
    age = a;
  }
}

這時,建立物件時,便可以傳入參數給People類別的物件設定它的屬性
1
People p2 = new People("May",12);

這時,在初始化p2物件時,也會把May和12傳入建構子中,而建立了p2物件

p2.name是May
p2.age是12
這兩個方法的差別在於,前者的資訊是固定的,而後者可以由使用者自訂
而其中的彈性,便是建構子的奧妙之一囉Smile


wttmama edited on 2004-04-19 01:35
reply to postreply to post
作者 Re:我想請問一下建構子的問題 [Re:lan]
築夢





發文: 17
積分: 0
於 2004-04-19 18:15 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
謝謝兩位的解答,原本不懂得現在已經稍微了解了,小弟獲益良多,謝謝!

reply to postreply to post
作者 Re:我想請問一下建構子的問題 [Re:lan]
yengceng





發文: 17
積分: 0
於 2004-04-21 14:01 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
wttmama 大大,你能否再舉個例子,講一下,
自定建構子與預設建構子呢..謝謝~


reply to postreply to post
作者 Re:我想請問一下建構子的問題 [Re:lan]
musichemi

Java流.忍者



發文: 44
積分: 0
於 2004-04-21 14:17 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
預設建構子與自訂建構子只是在於你用了constructor的多載(overloading), (之前誤打,在此修正)
帶不同的參數,就創建出不同的自訂建構子。

最基本的預設建構子(甚至不用寫)是不帶任何參數的,
所以你只要new一個class的instance,就啟動了default constructor。

如果你自訂了其他有帶參數的多型constructor,
你在new的時候選用的參數就會自動去指定你的user-define constructor。

在class People中:

//預設建構子
//(這麼說是比較籠統的說法,其實預設建構子是完全不用寫出來的,
寫出來後其實只是去override預設建構子,
充其量只是一個"不帶參數"的自訂建構子 :p )
public People(){
[述敘句....]
}

//多載之一
public People(string name){
[述敘句....]
}

//多載之二
public People(string name, int Age){
[述敘句....]
}

端看你去new一個class的instance時,使用到哪一種,
就會去跑哪一個建構子。
因為是多型,所以你的constructor名稱當然也都是People。

(ps. 上面的是pseudo-code~ 所以沒有用code的tag Big Smile)


musichemi edited on 2004-04-21 23:17
reply to postreply to post
當自己學的愈多時,才驚覺自己懂的太少。
作者 Re:我想請問一下建構子的問題 [Re:lan]
yengceng





發文: 17
積分: 0
於 2004-04-21 19:43 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我提供一下建構子的程式,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
public class MainClass  //主程式
{
   public static void main(String args[])
   {
     variable_define count = new variable_define();
     System.out.println("width= "+ count.Return_width() );
     System.out.println("length= "+ count.Return_length() );
     System.out.println("area= "+ count.Return_width() * count.Return_length() ); 
   }
}  
 
class variable_define   //副程式
{
      int width;
      int length;
      int area;
      //預設的建構子在這裡
      variable_define()
      {
        width=3;
        length=4;
        area=0;
      }
      int Return_width()
      { return width;}
      
      int Return_length()
      { return length;}
      
      int Return_area()
      { return area;}
        
}


這個程式裡,我有兩個問題,一個是,什麼是預設建構子,再來就是,
int Return_width()
{ return width;}
這是什麼意思啊..
可不可麻煩白話一點解釋給我聽一下呢,謝謝!!


yengceng edited on 2004-04-21 21:58
reply to postreply to post
作者 Re:我想請問一下建構子的問題 [Re:yengceng]
anthonycs



版主

發文: 1195
積分: 6
於 2004-04-21 20:29 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
公告 版主: anthonycs
您違反了以下的論壇規範 .

四、詳細的準備問題
3.原始程式
為了讓您的程式碼能夠讓人易於閱讀,請務必使用"code"標記,將您的程式包起來。這樣子有助於大家閱讀您的程式碼.

請立即標記您的程式碼,請看FAQ - 如何標記程式碼,否則文章將在一天之內鎖定.


reply to postreply to post
新手請維持互動討論精神, 請看良好的 討論示範
作者 Re:我想請問一下建構子的問題 [Re:yengceng]
musichemi

Java流.忍者



發文: 44
積分: 0
於 2004-04-22 00:21 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list

yengceng Wrote:
這個程式裡,我有兩個問題,一個是,什麼是預設建構子,再來就是,
int Return_width()
{ return width;}
這是什麼意思啊..
可不可麻煩白話一點解釋給我聽一下呢,謝謝!!


1.預設建構子就是你什麼constructor都不用寫...
在class中就自動會去跑一個 this() 的constructor,
用意只是在於你去new一個class的instance時,
把其所定義的variable都初始化而已。

如果你要使用預設建構子去達成你的variable_define class的話,
其實什麼都不用寫,
直接把變數的宣告和初始化寫在一起就好了。

2. return就是你的函式中有設定return type時(下面例子紅色的int就是)
那就需要在函式結束前回傳一個傳給caller,
而回傳的值的return type一定要和原本函式設定的return type一致。

例如:

1
2
3
4
5
6
7
8
9
10
  
    //函式定義:
    public int  addFun(int x, int y) {
           return x + y;
     }
 
    //在caller時機使用時:
    int x=5, y=10 , sum=0;
 
    sum = addFun(x, y);


這時的sum就變成 15囉~ 因為addFun(x, y)被call了時,
會回傳(return)x + y的結果,也就是15
所以call了那function後,其作用其實就變成這樣 sum = 15;
return就是在回傳你想傳的值用的,在data type上設定要有一致性

建議1:
一般而言class的命名都會以首子大寫,斷字再大寫來命名為習慣,
如: VariableDefine

建議2:
在使用取用函式一般會寫成 getXXX()
而在修改函式一般會寫成 setXXX()
(XXX的第一個字大寫)

建議1:
你的第二個class最好是加上存取權限的修飾字 public, private, protected 等
而且你的width, length, area應該設成private,
這樣你使用public的取用函式才會有意義。

修正後完整的程式如下(以你想要使用預設建構子為例):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class MainClass  //主程式
{
   public static void main(String args[])
   {
     VariableDefine count = new VariableDefine();
     System.out.println("width= "+ count.getWidth()  );
     System.out.println("length= "+ count.getLength()  );
     System.out.println("area= "+ count.getWidth()  * count.getLength()  ); 
   }
}  
 
public  class VariableDefine   //副程式
{
     private int width=3;
     private int length=4;
     private int area=0;

    //因為沒有自訂建構子,所以預設建構子this()就會被執行
    //說白一點(也就是不做其他的事)
    //也就是你不用再手寫一個width、length、area的初始化建構子
    //既然你想要直接new完instance後就讓width=3, length=4, area=0的話
    //就直接在declare時順便initialize就行了(這樣就等於跑了預設建構子了)
 
     public  int getWidth()  {
           return width;
     }
      
     public  int getLength(){ 
          return length;
     }
      
     public   int getArea(){
         return area;
    }
        
}


musichemi edited on 2004-04-22 00:32
reply to postreply to post
當自己學的愈多時,才驚覺自己懂的太少。
作者 Re:我想請問一下建構子的問題 [Re:lan]
yengceng





發文: 17
積分: 0
於 2004-04-22 01:02 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
那假如以這個程式為範本,我怎麼自訂建構子啊..
你可以直接做好,然後教我嗎?
謝謝~

既然你想要直接new完instance後就讓width=3, length=4, area=0的話,
這句話裡的instance是什麼意思丫..
就直接在declare時順便initialize就行了(這樣就等於跑了預設建構子了)
這句話裡是什麼意思丫..
那為什麼要用return啊,在這裡有什麼特別的意思嗎?


yengceng edited on 2004-04-22 01:12
reply to postreply to post
作者 Re:我想請問一下建構子的問題 [Re:yengceng]
anthonycs



版主

發文: 1195
積分: 6
於 2004-04-22 01:25 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
yengceng wrote:
[略]
你可以直接做好,然後教我嗎?
謝謝~
[略]


關於自訂建構子 , 一般書本上都有稍微解釋 , 論壇上也有一些文章供參考
資料也很容易取得 , 希望您稍稍作一下功課. Smile

至少 musichemi兄 給您的資料或意見 , 您可以試著去做做看或加以改變吧
成功的話相信您也會有成就感 , 遇到問題也可再討論 , 謝謝


reply to postreply to post
新手請維持互動討論精神, 請看良好的 討論示範
作者 Re:我想請問一下建構子的問題 [Re:lan]
yengceng





發文: 17
積分: 0
於 2004-04-22 09:37 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
嗯,多謝版大,我會努力看懂他的。
其建構子還不是很懂,但是我的書本又只提到一點,所以學得一點皮毛也沒有,因此想說,利用程式來解釋,或許會比較清楚~
但是因為小弟我是夜間部的學生,平常時較沒時間看,老師明天要口試了,所以最近才一直在針對建構子在發問~感謝musichemi與版大......


reply to postreply to post
» JWorld@TW »  Java 新手區

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8