Re: [問題] 新手繼承問題(非作業)
※ 引述《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
10/20 22:11, 2F
推
10/20 22:13, , 3F
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
10/20 22:17, 4F
→
10/21 00:09, , 5F
10/21 00:09, 5F
推
10/21 00:14, , 6F
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
10/21 16:05, 7F
→
10/21 17:08, , 8F
10/21 17:08, 8F
→
10/21 17:10, , 9F
10/21 17:10, 9F
推
10/21 18:08, , 10F
10/21 18:08, 10F
討論串 (同標題文章)
以下文章回應了本文 (最舊先):
完整討論串 (本文為第 2 之 4 篇):