作者No (you stay there)
看板java
标题Re: [问题] 新手继承问题(非作业)
时间Sat Oct 20 18:16:19 2012
※ 引述《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
1F:推 TWTRubiks:哇~! 感谢大大~! 这本书是因为现在大二老师上课用的 10/20 22:09
2F:→ TWTRubiks:另外,要怎麽样决定要用public还是private 10/20 22:11
3F:推 TWTRubiks:我知道2个的差别~! 不过因为题目上没规定(通常会写) 10/20 22:13
这部份建议可以回头看看封装(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
4F:推 TWTRubiks:所以我才自己乱设定,小弟刚学不到1个月,请多多包涵 10/20 22:17
5F:→ cha122977:借问,我习惯用this.name而不用name,performance有差吗 10/21 00:09
6F:推 TWTRubiks:this.name=name,是只这样吗?! 应该没差吧 10/21 00:14
我用1,000,000,000次的回圈各跑了两种case几次 (WinXP, JRE6)
counter += 1 和 this.counter += 1;
时间上毫无差别
※ 编辑: No 来自: 1.165.195.39 (10/21 02:24)
7F:→ cha122977:感谢,看来compiler後的结果是一样的@@ 10/21 16:05
8F:→ TWTRubiks:原来可以用super把他写死哦~!! 至於说到扩充成绩 10/21 17:08
9F:→ TWTRubiks:应该就要用 多形 的观念了吧!!? 10/21 17:10