Re: [問題] 新手繼承問題(非作業)

看板java作者 (you stay there)時間13年前 (2012/10/20 18:16), 編輯推噓5(505)
留言10則, 2人參與, 最新討論串2/4 (看更多)
※ 引述《TWTRubiks (阿哲)》之銘言: : 看到書上想練習一下, : 題目是: : 請建立Java程式宣告Person類別,擁有name姓名和id編號,新增printPerson()成員方法 : 可以顯示個人資料,然後宣告Student類別繼承自Person類別,擁有3次考試成績,請覆寫 : printPerson()方法來計算總分和平均。 雖然這書出的題目怪怪的 但大概是想要你練習繼承和override(你理解的那個覆寫) : 這裏我就有一個問題了~! 到底是要印出總分和平均就好,還是也要印出姓名和編號 : (因為我想說繼承了) 要不要你應該可以自己決定 : : 不過我網路上查了一下~! 大家還是都把 姓名和編號 印出來了,所以我也印出來 : 以下我的程式碼: 以下大部分是一些慣例或建議 : package Test; 通常 package name 會用全小寫 : class Person{ : private String name; //宣告姓名和編號 : public int id; 除非你取的變數名稱很詭異,不然這一行註解是可以不用 然後讓id public是危險的,通常id有識別的用途 讓外部類別可以任意修改你不覺得抖抖的嗎 : public Person(String N,int I){ //建構子 : name=N; id=I; 通常參數也會用小寫開頭 : } : public String getName(){ //因為我把name宣告成private : //,所以需要用 getName() : return name; : } : public void printPerson(){ : System.out.println("姓名:"+getName()); 內部可以直接取得name時,可以直接寫name就好 有人說是效率問題 但,也有人說用方法取得可以增加維護性 不過現在IDE要一次修改全部的成員名稱參照已經很方便了 : System.out.println("編號:"+id); 雖然題目要求printPerson方法 但一般來說在這裡印出來就像上一篇講的 會降低彈性和重用性等等 那本書要是一直這樣寫範例給你看的話 可以考慮換一本XD : } : } : //以下子類別 : class Student extends Person{ : public int g1,g2,g3; //宣告3個成績 可以思考一下 若之後當你要再增加另外兩個成績時 目前的設計是不是有些困擾 還有為何是public? : public Student(String N,int I,int g1,int g2,int g3){ : super(N,I); 類別生成instance的過程中 也必須初使化父類別 因此這裡你呼叫了super的建構子 這也是為什麼你必須在new Student的時候帶入name和id 它們不是多餘的 但也不是"一定要"的 例如你可以 super("ker ker", 5566); 去寫死它 端看你的設計情境而定 不過通常子類別會和父類別有相似(同)的建構子參數 另外可以思考一下在建構子必須初始化分數 是否也降低了類別的彈性 也就是我上面提到的,當要另外增加兩個分數時有些困擾 : this.g1=g1; this.g2=g2; this.g3=g3; : } : public int getG1(){ : return g1; : } : public int getG2(){ : return g2; : } : public int getG3(){ : return g3; : } : public void printPerson(){ //在這裡我覆寫了 : int a,sum; : a=getG1()+getG2()+getG3(); : sum=a/3; : System.out.println("總分:"+a); : System.out.println("平均:"+sum); : } : } : public class test { : /** : * @param args : */ : public static void main(String[] args) { : // TODO Auto-generated method stub : Person P1=new Person("TWTRubiks",1100104105); : Student S2=new Student("TWTRubiks",1100104105,100,100,60); : // 上面好像一定要數入 "TWTRubiks",1100104105 ,因為繼承了,所以如 : // 果不輸入會錯誤 : P1.printPerson(); : S2.printPerson(); : } : } : 結果印出 : 姓名:TWTRubiks : 編號:1100104105 : 總分:260 : 平均:86 : 我想問,如果以這題目來講,我這樣做算對嗎?! : 因為我一直覺得我的Student S2=new Student("TWTRubiks",1100104105,100,100,60); : 的"TWTRubiks",1100104105,是多寫的,不過不寫又不行 : 請各位大大幫我看看 : 非功課,自己練習遇上的小問題 建議可以把override的部份再看一次 就知道為何只會出現分數,而沒有個人資料 更多其他的物件設計建議 請參考上一篇板友回文 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.165.195.39

10/20 22:09, , 1F
哇~! 感謝大大~! 這本書是因為現在大二老師上課用的
10/20 22:09, 1F

10/20 22:11, , 2F
另外,要怎麼樣決定要用public還是private
10/20 22:11, 2F

10/20 22:13, , 3F
我知道2個的差別~! 不過因為題目上沒規定(通常會寫)
10/20 22:13, 3F
這部份建議可以回頭看看封裝(Encapsulation)的概念 雖然我覺得你應該煩惱的是.. 什麼時候該用 protected 什麼時候該用 friend (不寫修飾詞時的預設值) 一般來說類別的成員都會是 private 要提供給其他類別存取都透過getter、setter 甚至更謹慎的getter在回傳物件時,會複製一份回傳 而不直接回傳自己持有的物件參照 這裡也是端看你的設計 有些情況成員適合用 public 例如作為資料載具的類別時,可以少寫一點程式碼 Android 就有這樣的 Message 類別 http://developer.android.com/reference/android/os/Message.html 例如供其他類別辨識用的狀態碼 class GameState { public static final STATE_IDLE = 0x0; public static final STATE_RUNNING = 0x1; private int currentState; // 略 public int getState() { return currentState; } } class Game { private GameState state; // 略 public void doSomething() { if(state.getState() == GameState.STATE_RUNNING) { // do some process } } } 我目前只想到這兩個例子 或許還有其他情況 it depends on your design

10/20 22:17, , 4F
所以我才自己亂設定,小弟剛學不到1個月,請多多包涵
10/20 22:17, 4F

10/21 00:09, , 5F
借問,我習慣用this.name而不用name,performance有差嗎
10/21 00:09, 5F

10/21 00:14, , 6F
this.name=name,是只這樣嗎?! 應該沒差吧
10/21 00:14, 6F
我用1,000,000,000次的迴圈各跑了兩種case幾次 (WinXP, JRE6) counter += 1 和 this.counter += 1; 時間上毫無差別 ※ 編輯: No 來自: 1.165.195.39 (10/21 02:24)

10/21 16:05, , 7F
感謝,看來compiler後的結果是一樣的@@
10/21 16:05, 7F

10/21 17:08, , 8F
原來可以用super把他寫死哦~!! 至於說到擴充成績
10/21 17:08, 8F

10/21 17:10, , 9F
應該就要用 多形 的觀念了吧!!?
10/21 17:10, 9F

10/21 18:08, , 10F
我們是用這本書 http://goo.gl/NRmtr <<使用這本書
10/21 18:08, 10F
文章代碼(AID): #1GWdduKC (java)
討論串 (同標題文章)
文章代碼(AID): #1GWdduKC (java)