Discussion:
[問題] 請問建構子
(时间太久无法回复)
啊哈
2007-04-11 04:14:44 UTC
Permalink
不好意思,我是個初學者,有個問題想請教:

如果 class 裡有建構子設定,如:
public Date (int m, int d, int y) //建構子其一
{
month = m;
day = d;
year = y;
}

那我可以寫 Date birthday = new Date();
也就是沒給任何參數,這樣可以嗎?
因為程式跑起來有問題,所以我假設這是不行的,
於是我又寫了另一個建構子:
public anDate(){} //建構子其二
想法是以這個建構子創出來的 instance 裡面是空白的,
不過跑程式又出現問題了…

我知道 C++ 可以有內容空白的建構子,
想請問 java 也可以嗎?該怎麼寫?

謝謝回答~

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.117.189.37
骨頭
2007-04-11 06:28:13 UTC
Permalink
※ 引述《towalking (啊哈)》之銘言:
: 不好意思,我是個初學者,有個問題想請教:
: 如果 class 裡有建構子設定,如:
: public Date (int m, int d, int y) //建構子其一
: {
: month = m;
: day = d;
: year = y;
: }
: 那我可以寫 Date birthday = new Date();
: 也就是沒給任何參數,這樣可以嗎?
: 因為程式跑起來有問題,所以我假設這是不行的,
: 於是我又寫了另一個建構子:
: public anDate(){} //建構子其二
: 想法是以這個建構子創出來的 instance 裡面是空白的,
: 不過跑程式又出現問題了…
: 我知道 C++ 可以有內容空白的建構子,
: 想請問 java 也可以嗎?該怎麼寫?
: 謝謝回答~

你會出現問題應該是因為 Date()是預設class

new Date()的時候發生參照錯誤 , 命名要盡量避開 API有的類別名稱
http://java.sun.com/j2se/1.5.0/docs/api/java/util/Date.html


java當然可以有空白建構子

以你的例子來講


class myDate{
int year;
int month;
int day;
public myDate(){}
public myDate(int year,int mon,int day){
this.year=year;
month=mon;
this.day=day;
}
}
class PracticeOnly {

public static void main( String[] arg ) throws Exception{

myDate m=new myDate();
myDate mm=new myDate(2006,1,1);

//work
}
}

--
 String temp="relax"; | Life just like programing
 while(buringlife) String.forgot(temp); | to be right or wrong
 while(sleeping) brain.setMemoryOut(); | need not to say
 stack.push(life.running); | the compiler will
 stack.push(scouting.buck()); | answer your life
 stack.push(bowling.practice()); | Bone everything

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.134.27.68
ArssertionError
2007-04-11 09:34:37 UTC
Permalink
※ 引述《towalking (啊哈)》之銘言:
: 不好意思,我是個初學者,有個問題想請教:
: 如果 class 裡有建構子設定,如:
: public Date (int m, int d, int y) //建構子其一
: {
: month = m;
: day = d;
: year = y;
: }
: 那我可以寫 Date birthday = new Date();
: 也就是沒給任何參數,這樣可以嗎?
可以
但是要自己在class Date中宣告一個空白建構子

如果一個類別中你沒有寫建構子
編譯時會自動產生一個預設建構子 就是空白的 像這樣
public Date(){}
但是如果有宣告了建構子 就不會自動產生
有需要無參數建構子的話 要自己補上

這在繼承上尤其重要
因為子類別會自動呼叫super();(在類別的第一行)
所以如果父類別沒寫空白建構子 編譯時就會有問題

以上
--
另外 Date不是API中的類別嗎...

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.113.65.27
啊哈
2007-04-11 10:19:27 UTC
Permalink
※ 引述《DavyBlue (ArssertionError)》之銘言:
: ※ 引述《towalking (啊哈)》之銘言:

: :public Date (int m, int d, int y) //建構子其一
: : {
: : month = m;
: : day = d;
: : year = y;
: : }
: : 那我可以寫 Date birthday = new Date();

找到錯誤了,請看:
 public anDate(){} //建構子其二
 我另外一個建構子寫這樣…
 謝謝版友提醒我了建構子名稱都應該要跟 class 名一樣
 對了,這觀念就叫“多型”是吧?
: 可以
: 但是要自己在class Date中宣告一個空白建構子
: 如果一個類別中你沒有寫建構子
: 編譯時會自動產生一個預設建構子 就是空白的 像這樣
: public Date(){}
: 但是如果有宣告了建構子 就不會自動產生

 嗯嗯 了解 跟 C++ 一樣

: 有需要無參數建構子的話 要自己補上
: 這在繼承上尤其重要
: 因為子類別會自動呼叫super();(在類別的第一行)
: 所以如果父類別沒寫空白建構子 編譯時就會有問題
: 以上

 版友另外有說是不是要把 class 的名稱改一下(原本是 Date)
 後來經過試驗,class Date 也是沒問題的,
 最大的錯誤是我把另外一個空白建構子寫成 public anDate(){}。
 (其實課本習題就是要我們設一個 class Date 呢)

 最後想再問一個問題,
 return 是不是一次只能回傳一個值呢?
 
 public int getMonth()
{
return month;
  return day;
return year;
}

 這麼寫是不是不行呢?

 謝謝版友們解答~

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.117.189.37
就是讚啦
2007-04-11 11:17:22 UTC
Permalink
※ 引述《towalking (啊哈)》之銘言:
: ※ 引述《DavyBlue (ArssertionError)》之銘言:
: 找到錯誤了,請看:
:  public anDate(){} //建構子其二
:  我另外一個建構子寫這樣…
:  謝謝版友提醒我了建構子名稱都應該要跟 class 名一樣
:  對了,這觀念就叫“多型”是吧?
: : 可以
: : 但是要自己在class Date中宣告一個空白建構子
: : 如果一個類別中你沒有寫建構子
: : 編譯時會自動產生一個預設建構子 就是空白的 像這樣
: : public Date(){}
: : 但是如果有宣告了建構子 就不會自動產生
:  嗯嗯 了解 跟 C++ 一樣
: : 有需要無參數建構子的話 要自己補上
: : 這在繼承上尤其重要
: : 因為子類別會自動呼叫super();(在類別的第一行)
: : 所以如果父類別沒寫空白建構子 編譯時就會有問題
: : 以上
:  版友另外有說是不是要把 class 的名稱改一下(原本是 Date)
:  後來經過試驗,class Date 也是沒問題的,
:  最大的錯誤是我把另外一個空白建構子寫成 public anDate(){}。
:  (其實課本習題就是要我們設一個 class Date 呢)
:  最後想再問一個問題,
:  return 是不是一次只能回傳一個值呢?
:  
:  public int getMonth()
: {
: return month;
:   return day;
: return year;
: }
:  這麼寫是不是不行呢?
:  謝謝版友們解答~
基本上是可以這樣寫,但是return day 和 return year
並沒什麼意義,第一個return就已經把值傳回呼叫程式了!
所以return day ,return year有寫跟沒寫ㄧ樣的
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.170.51.9
※ 編輯: tgbsa 來自: 218.170.51.9 (04/11 19:17)
骨頭
2007-04-11 11:31:46 UTC
Permalink
※ 引述《towalking (啊哈)》之銘言:
: ※ 引述《DavyBlue (ArssertionError)》之銘言:
:  public int getMonth()
: {
: return month;
:   return day;
: return year;
: }
:  這麼寫是不是不行呢?
:  謝謝版友們解答~

就語意來說,

你可以寫成
public int[] getMonth(){
return new int[]{year,month,day};
}
用一個可以存放多個int的資料結構作回傳值。

話說我以為你是舉例,沒想到你的建構子真的是這樣寫。敗了。XD



另外使用API 預設類別,會有class引用錯誤的疑慮,
一般是建議不要使用預設類別的名稱。


另外,要問問題請貼錯誤訊息上來!!(這絕對不是我在腦羞 XD)

--
我本來以為你是
import java.util.Date;
後出現err的...... XD


--
I am a person, and I am always thinking .
Thinking in love , Thinking in life ,
Thinking in why , Thinking in worth.
I can't believe any of what ,
I am just thinking then thinking ,
but worst of all , most of mine is thinking not actioning...

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.134.27.68

Loading...