Microsoft Word - G3_BK_Ch06-8.doc
|
|
|
- 坤 黄
- 7 years ago
- Views:
Transcription
1 第 6 章抽象類別 125 第二篇 抽象与接口之应用 围棋国宝吴清源说 : 整体 和谐与创新 是棋艺的真谛 接口 就像红绿灯及斑马线, 创造了交通的和谐与秩序
2 126 Android 的對象技術 (OOP)
3 第 6 章抽象類別 127 Android 的對象技術教材下載
4 128 Android 的對象技術 (OOP) 第 6 章 抽象类别 (Abstract Class) 6.1 抽象类别与继承体系 6.2 从抽象类别 衍生 出具体类别 6.3 Android 的抽象类别之例 6.4 抽象函数之妙用 : 预设行为 6.5 Android 预设行为之例 6.6 抽象函数之妙用 : 反向调用 6.7 Android 反向调用之例 6.8 应用于 C/C++
5 第 6 章抽象類別 抽象类别与继承体系 在前面各章里, 介绍过类别继承体系, 例如 : 图 6-1 Android 的 View 类别体系 这是人们利用天赋的抽象 (Abstraction) 能力, 将对象加以分门别类, 所以这 个继承关系中的父类 (Super-class) 又称为抽象类别 (Abstract Class) 抽象 一词的 相对名词是 具象 或称为 具体 (Concrete), 所以继承关系中的子类 (Subclass) 又称为具体类别 (Concrete Class) 具体类别 一般类别是具体而完整的, 每一个函数都有完整的实作 (Body) 部份, 我们可 以随意拿它来创建对象 这是大家已经熟悉的类别了 这样的一般类别就是刚才 提过的具体类别了
6 130 Android 的對象技術 (OOP) 抽象类别 抽象类别的来源是 : 洞悉及分离出 变 ( 或差异 ) 的部分与 不变 ( 或共同 ) 的部份 ; 然后抽掉差异部份, 而留下共同部分, 并以类别表示之, 就成为抽象类别了 ; 由于已经抽掉一些部分, 所以抽象类别的本质是不完整的, 预留一些有待填补的空间 例如, 建房子时, 师傅都会预留一些卡榫, 可做未来衔接点 例如, 从具体类别抽掉某些函数的实作 (Body) 部分, 这些函数就称为抽象函数 (Abstract Function), 而含有抽象函数的类别就称为抽象类别 (Abstract Class) 了 例如 : /* jx06-01 */ abstract class SalesPerson { private String name; private String sex; protected float BasicFee; protected float Discount; public SalesPerson(String na, String sx){ name = na; sex = sx; public void SetFee(float basic_fee, float disc){ BasicFee = basic_fee; Discount = disc; public abstract float GetTotal(); public abstract void display(); public class JMain { public static void main(string[] args) { /* Can not create objects... SalesPerson alice = new SalesPerson("Alice", "Male"); alice.setfee(2000f, 0.8f); alice.display(); */ 其中,GetTotal() 和 display() 函数的实作部份被抽掉了, 所以是抽象函数 (Abstract Function) 在 Java 里禁止你拿抽象类别来创建对象, 会要求你使用
7 第 6 章抽象類別 131 abstract 关键词来区别一般类别与抽象类别 而且使用 abstract 关键词来区别一般函数与抽象函数 由于 SalesPerson 类别的 GetTotal() 和 display() 函数欠缺实作部份, 如果也拿它创建对象 alice, 并调用其 display() 函数, 如下之指令 : alice.display(); 则会发生严重问题 : 计算机执行到此指令的时候, 将找不到实作指令, 而无法执行了 6.2 从抽象类别 衍生 出具体类别 也许你会说道 : 这种抽象类别是没有用的! 其实不然, 就像老子在数千年前 已经说过, 像房子的中间 门 窗皆是虚的空间的, 才能供人们进出 居住与透 透空气 其积极效果是 : 日后依新环境的条件而加以调整 充实, 创造出多样化 的用途 例如畚箕的中间是空 虚的, 才能装泥土 垃圾等各式各样的东西 此 外, 畚箕的空无, 创造了畚箕的再利用性 (Reusability), 装完了泥土, 倒掉之后, 还可拿来装垃圾等, 不断重复使用之, 一直到坏掉为止 抽象类别就如同一间空房子, 添加一些家具 ( 如函数的实作部份 ), 就能让人 住得愉快了 在 Java 里, 使用子类 (Subclass) 来填补函数的实作部份 例如, 我 们可以写个具体类别来填补的 SalesPerson 抽象类别的空缺部分, 如下 : /* jx06-02 */ abstract class SalesPerson { protected String name; protected String sex; protected float BasicFee; protected float Discount; public SalesPerson(String na, String sx){ name = na; sex = sx; public void SetFee(float basic_fee, float disc){ BasicFee = basic_fee; Discount = disc;
8 132 Android 的對象技術 (OOP) public abstract float GetTotal(); public abstract void display(); class SalesEngineer extends SalesPerson { public SalesEngineer(String na, String sx){ super(na, sx); public float GetTotal(){ return super.basicfee * super.discount; public void display() { System.out.println("SalesEngineer: " + name + " Fee: " + this.gettotal()); public class JMain { public static void main(string[] args) { SalesEngineer alice = new SalesEngineer("Alice", "Male"); alice.setfee(2000f, 0.8f); alice.display(); 这个简单的范例, 说明了两个重要动作 : 抽象 将一般类别的变异部份抽掉, 留下来的稳定部分, 称为抽象类别 (Abstract Class) 衍生 从有预留而不完整的抽象类别, 加添些特殊功能, 成为具体类别 (Concrete Class), 再创建对象 抽象类别, 并非具体的类别, 不能用来创建对象, 看似无用的东西 其实它可衍生出无数个具体子类, 可创建出无数种对象来!抽象类别中的抽象 ( 即 abstract) 函数内容常是空的, 能虚怀若谷, 让应用程序师不断充实它, 其子孙类别就个个精明能干!抽象类别发挥无用之用的效果, 衍生 之动作则更进一步地发挥这种效果 人们易于得意骄傲, 不易虚怀若谷 同样地, 易于创造具体类 别, 而不易创造出抽象类别 不过, 当您懂得善藉眼前的 无用 来换取长远的 有用 时, 创造与使用抽象类别就易如反掌了
9 第 6 章抽象類別 Android 的抽象类别之例 Android 是应用框架, 而抽象类别又是应用框架的主角, 所以 Android 里含 有各式各样的抽象类别 例如 BroadcastReceiver 和 Service 两个皆是抽象类别 BroadcastReceiver 与 Service Activity 是息息相关的 : Activity 好像是应用程序的眼睛, 提供与 User 互动之窗 BroadcastReceiver 好像是耳朵, 接收来自各方的 Intent 讯息 Service 好像是手, 提供符合 Intent 意图之服务 由于 BroadcastReceiver 和 Service 两者都定义了抽象函数, 它们的子类一定要覆写之, 才能补充它们刻意留下来的 不足 之处 请看下述范例程序 : 操作情境 : 1. 此程序一开始, 画面出现两个按钮如下 : 2. 按下 <call_service> 按钮, 暂停 15 秒 : 3. 等待 15 秒后, 委托 Alarm Manager 发出 intent 对象 当 BroadcastReceiver 接
10 134 Android 的對象技術 (OOP) 到 intent 对象时, 就启动 NotifyService, 此服务会回传字符串, 显示于 ac01 画面的 Title 区域 : 4. 按下 <Exit>, 程序就结束了 撰写步骤 : Step-1: 建立 Android 项目 :Fx01 Step-2: 撰写 BroadcastReceiver 的子类 :AlarmReceiver, 其程序码如下 : // AlarmReceiver.java 程序码 package com.misoo.pkzz; import android.content.broadcastreceiver; import android.content.context; import android.content.intent; public class AlarmReceiver extends BroadcastReceiver public void onreceive(context context, Intent intent) { context.startservice(new Intent(context, NotifyService.class));
11 第 6 章抽象類別 135 Step-3: 撰写 Service 的子类 :NotifyService, 其程序码如下 : // NotifyService.java 程序码 package com.misoo.pkzz; import android.app.service; import android.content.intent; import android.os.ibinder; public class NotifyService extends protected void oncreate() { ac01 app = ac01.getapp(); app.btevent("from public IBinder onbind(intent intent) { return null; Step-4: 撰写 Activity 的子类 :ac01, 其程序码如下 : // ac01.java 程序码 package com.misoo.pkzz; import java.util.calendar; import android.app.activity; import android.app.alarmmanager; import android.app.pendingintent; import android.content.intent; import android.os.bundle; import android.widget.button; import android.view.view; import android.view.view.onclicklistener; public class ac01 extends Activity implements OnClickListener{ private static ac01 appref = null; private Button btn, btn2; private boolean k = protected void oncreate(bundle icicle) { super.oncreate(icicle); appref = this; setcontentview(r.layout.cs); btn = (Button)findViewById(R.id.call_service); btn.setonclicklistener(this); btn2 = (Button)findViewById(R.id.exit); btn2.setonclicklistener(this); public static ac01 getapp() { return appref; public void btevent( String data ) { settitle(data); public void onclick(view arg0) {
12 136 Android 的對象技術 (OOP) if(arg0 == btn){ settitle("waiting... Alarm=15"); Intent intent = new Intent(ac01.this, AlarmReceiver.class); PendingIntent p_intent = PendingIntent.getBroadcast(ac01.this, 0, intent, 0); Calendar calendar = Calendar.getInstance(); calendar.settimeinmillis(system.currenttimemillis()); calendar.add(calendar.second, 15); // Schedule the alarm! AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); am.set(alarmmanager.rtc_wakeup, calendar.gettimeinmillis(), p_intent); if(arg0 == btn2){ Intent intent = new Intent(ac01.this, AlarmReceiver.class); PendingIntent p_intent = PendingIntent.getBroadcast(ac01.this, 0, intent, 0); AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); am.cancel(p_intent); finish(); Step-5: 执行之 说明 : 1. BroadcastReceiver 抽象类别里定义了 onreceive() 抽象函数 所以子类 AlarmReceiver 就将之补充起来, 如下的 onreceive() 函数 public void onreceive(context context, Intent intent) { context.startservice(new Intent(context, NotifyService.class), null); 2. 同样地,Service 抽象类别里定义了 onbind() 抽象函数 所以子类 NotifyService 就将之补充起来, 如下的 onbind() 函数 public IBinder onbind(intent intent) { return null; 如此,NotifyService 就成为具体类别了
13 第 6 章抽象類別 抽象函数之妙用 : 预设行为 在前面第 6.2 节里, 抽象类别 SalesPerson 的抽象函数 GetTotal() 和 display(), 它们的实作指令部份都是从缺的 所以该抽象类别 ( 即 SalesPerson) 的子类 必须 补足这个欠缺, 才能成为一个具体类别 子类开发者的负担是蛮重的 如果将一些预设 (Default) 的实作部份加到抽象类别里, 则其子类就可选择要 不要修正这个预设实作部份, 这样可以减轻子类开发者的负担 例如下述之范例 : 其程序码如下 : /* Shape.java */ import java.awt.color; import java.awt.graphics; public abstract class Shape { Graphics m_gr; public Shape(Graphics gr) { m_gr = gr; public void onpaint(){ m_gr.setcolor(color.black); m_gr.fillrect(10,30, 200,100); public void paint() { onpaint(); // drawing background /* Bird.java */ import java.awt.color; import java.awt.graphics;
14 138 Android 的對象技術 (OOP) public class Bird extends Shape { Graphics m_gr; public Bird(Graphics gr) { super(gr); m_gr = gr; public void onpaint(){ super.onpaint(); // drawing a bird m_gr.setcolor(color.cyan); m_gr.drawarc(30,80,90,110,40,100); m_gr.drawarc(88,93,90,100,40,80); m_gr.setcolor(color.white); m_gr.drawarc(30,55,90,150,35,75); m_gr.drawarc(90,80,90,90,40,80); /* JMain.java */ import java.awt.graphics; import javax.swing.jframe; import javax.swing.jpanel; class JP extends JPanel { public void paintcomponent(graphics gr){ super.paintcomponents(gr); Shape bird = new Bird(gr); bird.paint(); public class JMain extends JFrame{ public JMain(){ settitle(""); setsize(350, 250); public static void main(string[] args) { JMain frm = new JMain(); JP panel = new JP(); frm.add(panel); frm.setdefaultcloseoperation(jframe.exit_on_close); frm.setvisible(true);
15 第 6 章抽象類別 139 此程序画出两只海鸥如下图 : 其中的抽象类别 Shape 的 paint() 和 onpaint() 函数都含有预设的实作指令 具 体类别 Bird 的设计者选择如下 : 不覆写 ( 即不修正 )paint() 函数 直接使用预设行为, 所以减轻了负担 覆写 ( 即修正 )onpaint() 函数 重用 (Reuse) 了预设行为, 也减轻了部分的 负担 此程序执行时, 主程序的指令 :bird.paint() 调用子类 Bird 的 paint(), 但是 Bird 并没有 paint() 函数, 于是采用父类 Shape 的预设 paint() 函数 此预设函数调用 onpaint(), 就反向调用了子类的 onpaint() 请注意, 是父类 paint() 调用子类的 onpaint(); 并不是父类 onpaint() 来调用子类的 onpaint() 反而是子类 onpaint() 调用父类的 onpaint()
16 140 Android 的對象技術 (OOP) 6.5 Android 预设行为之例 Android 是应用框架, 而在抽象类别里摆上一些预设行为又是应用框架的主要技俩, 所以 Android 里不仅含有各式各样的抽象类别, 而且也有各式各样的预 设行为 例如在 View 父类 ( 或称抽象类别 ) 里就定义了 ondraw() 函数 Button 又 从 View 类别继承而得到 ondraw() 函数 最后, 我们还可以撰写新类别去继承 Button 类别, 仍然继承而得 ondraw() 函数 在这个继承体系里的每一层级皆可覆 写这继承而来的 ondraw() 函数, 形成预设行为了 例如下述的范例程序 : 操作情境 : 1. 此程序一开始, 画面出现两个按钮如下 : 2. 如果按下 <Exit> 按钮, 程序就结束了 撰写步骤 : Step-1: 建立 Android 项目 :Fx02
17 第 6 章抽象類別 141 Step-2: 撰写 Activity 的子类 :ac01, 其程序码如下 : /* ac01.java */ package com.misoo.pkaz; import android.app.activity; import android.graphics.color; import android.os.bundle; import android.view.view; import android.view.view.onclicklistener; import android.widget.linearlayout; public class ac01 extends Activity implements OnClickListener { private okbutton ok_btn; private exitbutton public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); LinearLayout layout = new LinearLayout(this); layout.setorientation(linearlayout.vertical); ok_btn = new okbutton(this); ok_btn.setonclicklistener(this); LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(ok_btn.get_width(), ok_btn.get_height()); layout.addview(ok_btn, param); exit_btn = new exitbutton(this); exit_btn.setonclicklistener(this); exit_btn.settext("exit"); exit_btn.settextcolor(color.blue);
18 142 Android 的對象技術 (OOP) exit_btn.settextsize(25); exit_btn.setbackgroundresource(r.drawable.icon2); LinearLayout.LayoutParams param2 = new LinearLayout.LayoutParams(80, 55); param2.topmargin = 5; param2.leftmargin = 5; layout.addview(exit_btn, param2); setcontentview(layout); public void onclick(view v) { if(v == ok_btn) settitle("ok"); else if(v == exit_btn) finish(); Step-3: 撰写 Button 的子类 :okbutton, 其程序码如下 : /* okbutton.java */ package com.misoo.pkaz; import android.content.context; import android.graphics.canvas; import android.graphics.color; import android.graphics.paint; import android.widget.button; public class okbutton extends Button{ public okbutton(context ctx){ super(ctx); super.settext(" K"); super.settextsize(30); protected void ondraw(canvas canvas) { super.ondraw(canvas); Paint pa = new Paint(); pa.setcolor(color.yellow); canvas.drawcircle(30, 25, 17, pa); pa.setcolor(color.red); canvas.drawcircle(30, 25, 15, pa); pa.setcolor(color.yellow); canvas.drawcircle(30, 25, 12, pa); public int get_width(){ return 90; public int get_height(){ return 60;
19 第 6 章抽象類別 143 Step-4: 撰写 Button 的子类 :exitbutton, 其程序码如下 : /* exitbutton.java */ package com.misoo.pkaz; import android.content.context; import android.graphics.canvas; import android.widget.button; public class exitbutton extends Button { public exitbutton(context ctx){ protected void ondraw(canvas canvas) { super.ondraw(canvas); 说明 : 1. 我们在撰写 okbutton 类别时, 面对 Button 的预设行为, 可重复利用 (Reuse) 它, 也可以不用它 2. 因之, 我们有三种选择 : ( 一 ) 并不覆写 ondraw() 函数 这表示 ondraw() 函数的预设行为适合于 okbutton 类别, 直接继承 Button 父类的 ondraw() 函数就行了 ( 二 ) 完全覆盖掉父类的预设行为 这表示 ondraw() 函数的预设行为不适合于 okbutton 类别, 而且不想去重复利用 (Reuse) 它 ( 三 ) 重复利用 (Reuse) 它, 并且修正它 调用父类的预设行为 ( 如画出图画的背景 ), 在增添新的行为, 达到修正预设行为之目的 3. 例如,okButton 类别采取上述的第 ( 三 ) 种做法 既调用预设的行为绘出一个白色按钮, 而且自己画出彩色的图案 4. 再如,exitButton 类别采取上述的第 ( 一 ) 种做法 虽然表面上有覆写的形式, 但也只是调用父类的预设行为而已 所以,exitButton 的 ondraw() 函数是多 余的 可删去之
20 144 Android 的對象技術 (OOP) 6.6 抽象函数之妙用 : 反向调用 当子类继承父类, 而且覆写 (Override) 父类的函数时, 就可以产生反向调用 的现象, 也就是父类的函数调用子类的函数 虽然父类 ( 前辈 ) 创建时, 子类 ( 晚辈 ) 常常尚未创建;但是前辈有时候可预知晚辈中的函数, 就可调用它 像 Android 这样的应用框架里的抽象类别就是扮演父类的角色, 只是含有一些阳春型的类 别, 其提供很通用, 但不完整的函数, 是设计师刻意留给应用程序的子类来补充 的 一旦补充 ( 透过函数覆写之手段 ) 完成, 框架里的父类的函数就可以 反向调用 子类里的函数了 例如下述的范例程序 : 其程序码如下 : /* SalesPerson.java */ public abstract class SalesPerson { protected String name; protected String sex; protected float BasicFee; protected float Discount; public SalesPerson(String na, String sx){ name = na; sex = sx; public void SetFee(float basic_fee, float disc){ BasicFee = basic_fee; Discount = disc; public void display() { System.out.println(name + ", Fee: " + this.gettotal()); public abstract float GetTotal();
21 第 6 章抽象類別 145 /* SalesSecretary.java */ public class SalesSecretary extends SalesPerson { public SalesSecretary(String na, String sx){ super(na, sx); public float GetTotal() { return BasicFee * Discount - 100; /* JMain.java */ public class JMain { public static void main(string[] args) { SalesPerson linda = new SalesSecretary("Linda Fan", "Female"); linda.setfee(2500f, 0.7f); linda.display(); 请你仔细看看此程序的执行过程, 是很微妙而有趣的 此程序执行时, 先执行 JMain 类别的 main() 函数, 执行到指令 : linda.display(); 时, 就转而执行 SalesPerson 类别的 display() 函数 : public void display() { System.out.println(name + ", Fee: " + this.gettotal()); 执行到指令 :this.gettotal(); 由于 SalesSecretary 类别覆写了 GetTotal() 函数, 于是转而执行 SalesSecretary 类 别的 GetTotal() 函数 : public double GetTotal() { return BasicFee * Discount 100; 如下图所示 :
22 146 Android 的對象技術 (OOP) JMain main() { linda.display() SalesPerson display() { this.gettotal() ( 反向呼叫 ) SalesSecretary GetTotal() {. 图 6-2 典型的反向调用 (Inversion of Control) 机制 这程序显示了 抽象类别 + 预设函数 的美妙组合, 产生了下述的重要现象 : 1. 程序执行时, 主控权在抽象类别手上 虽然 main() 函数仍为程序的启动者, 但主要的处理过程是在 SalesPerson 的 display() 函数内 是它决定调用 GetTotal() 的 2. 具体类别的函数, 主要是供抽象类别调用之 例如,SalesSecretary 类别的 GetTotal() 供 SalesPerson 的 display() 函数调用之 3. 由于抽象类别掌握主控权, 复杂的指令皆摆在抽象类别中 其大幅简化了具体类别开发者的负担
23 第 6 章抽象類別 Android 反向调用之例 Android 是应用框架, 不但在抽象类别里摆上一些预设行为, 而且能进行反 向调用具体类别的覆写函数 抽象类别 预设行为和反向调用是应用框架的主要元素, 所以 Android 里不仅含有各式各样的抽象类别, 而且也有各式各样的预设 行为, 还能顺畅地反向调用 例如在 View 类别体系里各类别皆能覆写 ondraw() 函数, 让 View 类别继承的父类能顺利反向调用子类的 ondraw() 函数 例如下述的范例程序 : 操作情境 1. 此程序执行时, 呈现如下的画面 : 2. 如果按下 RadioButton, 画面就变换如下 : 3. 若按下 <Exit> 按钮, 程序就结束了
24 148 Android 的對象技術 (OOP) 撰写步骤 : Step-1: 建立 Android 应用程序项目 :Fx03 Step-2: 撰写 Activity 的子类 ac01, 其程序码如下 : /* ac01.java */ package com.misoo.ppxx; import android.app.activity; import android.os.bundle; import android.view.view; import android.view.viewgroup; import android.view.view.onclicklistener; import android.widget.button; import android.widget.linearlayout; import android.widget.radiobutton; public class ac01 extends Activity implements OnClickListener { private final int WC = ViewGroup.LayoutParams.WRAP_CONTENT; private MyView mv; private RadioButton ra; private Button public void oncreate(bundle icicle) { super.oncreate(icicle); LinearLayout layout = new LinearLayout(this); layout.setorientation(linearlayout.horizontal);
25 第 6 章抽象類別 149 LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(115, 250); param.leftmargin = 1; mv = new MyView(this); layout.addview(mv, param); ra = new RadioButton(this); ra.setonclicklistener(this); param = new LinearLayout.LayoutParams(WC, WC); param.topmargin = 40; layout.addview(ra, param); btn = new Button(this); btn.settext("exit"); btn.setonclicklistener(this); btn.setbackgroundresource(r.drawable.gray); param.leftmargin = 30; layout.addview(btn, param); setcontentview(layout); public void onclick(view v) { if( v == ra) mv.redraw(); else if(v == btn) finish(); Step-3: 撰写 View 的子类 MyView, 其程序码如下 : /* MyView.java */ package com.misoo.ppxx; import android.content.context; import android.graphics.canvas; import android.graphics.color; import android.graphics.paint; import android.view.view; public class MyView extends View { private Paint pa = new Paint(); private boolean yn = false; public MyView(Context context) { super(context); public void ReDraw(){
26 150 Android 的對象技術 (OOP) protected void ondraw(canvas canvas) { yn =!yn; pa.setcolor(color.white); canvas.drawrect(10, 10, 100, 100, pa); pa.setcolor(color.yellow); if(yn){ pa.setcolor(color.blue); canvas.drawcircle(55, 55, 15, pa); else { pa.setcolor(color.red); canvas.drawrect(40, 40, 70, 70, pa); Step-4: 执行之 说明 : 1. 这 MyView 子类覆写了 ondraw() 函数, 创造了反向调用的机会 2. 当我们按下 RadioButton 时, 就调用到 MyView 类别的 ReDraw() 函数, 进而调用到 View 的 invalidate() 函数 3. 接着, 就反向调用 MyView 子类的 ondraw() 函数, 在 UI 画面上绘出图形来 这就是典型的 反向沟通 了 4. 如果你没有定义 ondraw() 函数的话, 会执行 View 父类预设的 ondraw() 函数, 而依据框架预设之惯例而行了
27 第 6 章抽象類別 应用于 C/C++: 抽象类别 关于 C++ C++ 使用 "virtual" 关键词表明某个函数是会采取晚期连结 (Late Binding) 的 至于 Java 语言里则不必特别说明, 就是会进行晚期连结的 本节将先介绍抽象类别与虚拟函数之关系, 再谈虚拟函数与晚期连结之关系 抽象类别与纯粹虚拟函数 在实际 OOP 软件设计中, 常先发现子类, 然后将子类的共同特性, 定义于其父类中 例如 :Rose 公司生产网球拍 桌球拍及羽毛球拍 它们皆是 一种 (A kind of) 球拍, 因之发现了父类 球拍 ;这些类别构成一类别体系(Class Hierarchy) 如下 : 球拍 網球拍 桌球拍 羽毛球拍 像 球拍 这种类别称为 抽象类别 (Abstract Class) 其特性为 : (1) 不产生对象;亦即不用它来宣告对象 (2) 包含子类之共同数据项及函数, 让子类继承之 (3) 将子类组织成一类别体系, 支持多型性 再如, 前面的 Java 部分所举的推销员例子里, 推销部门之人员, 其职称若不是 SalesManager, 就是 SalesEngineer ;因之, 这些人员若非 SalesManager 类别之对象, 就是 SalesEngineer 类别之对象 则此 SalesPerson 就是一抽象类别, 它永 远不含有对象 C++ 对抽象类别做了较严谨之定义 :
28 152 Android 的對象技術 (OOP) 含纯粹虚拟函数 (Pure Virtual Function) 之类别, 称为抽象类别 纯粹虚拟函数之特征为 : 函数之 指令 (Body) 部分从缺 例如 : class SalesPerson { double total_amount; public: SalesPerson( double a ) { total_amount = a ; virtual double bonus()=0; ; 这 bonus() 函数里并没有指令, 是个纯粹虚拟函数 C++ 规定您必须把 0 指定 (Assign to) 给纯粹虚拟函数 因之, 纯粹虚拟函数之宣告格式为 : virtual 型态函数名称 ( ) = 0; 由于 SalesPerson 类别包含纯粹虚拟函数 bonus(), 所以它是抽象类别 不能利用抽象类别来宣告对象, 所以下述指令错了! SalesPerson s( ); 但是, 能宣告 SalesPerson 之指标如下 : SalesPerson *ps; 此 ps 可指向子类之对象, 而达到多型性之效果 例如 : //cx06-01.cpp #include <iostream.h> class SalesPerson { protected: double total_amt; public: SalesPerson( double a ) : total_amt(a) { virtual double bonus() const =0; ; class SalesEngineer : public SalesPerson { public: SalesEngineer(double a):salesperson(a) { virtual double bonus() const
29 第 6 章抽象類別 153 { return( total_amt * ); ; class SalesManager : public SalesPerson { public: SalesManager(double a):salesperson(a) { virtual double bonus() const { return( total_amt * ); ; void compute_bonus( const SalesPerson *ps ) { cout << "bonus:" << ps->bonus() << endl; int main() { SalesManager peter( ); SalesEngineer alvin( ), lily( ); compute_bonus( &peter ); compute_bonus( &alvin ); compute_bonus( &lily ); return(0); 其中,ps 为抽象类别 SalesPerson 之指标, 且 bonus() 为 virtual 函数;因之, 计算机对 ps->bonus() 指令做 晚期连结 (Late Binding) 动作 虚拟函数与晚期连结 例如 : 前面各章里已经介绍 C++ 的对象指针, 其具有一项特性 : 父类之指标, 能指向其子孙类别之对象 //cx06-02.cpp #include <iostream.h> class SalesPerson { double total_amount; public: SalesPerson( double a ): total_amount(a) { double bonus() const { return( total_amount * ); ;
30 154 Android 的對象技術 (OOP) class SalesEngineer:public SalesPerson { public: SalesEngineer( double a ):SalesPerson(a) {; double bonus() const { return( SalesPerson::bonus() ); ; int main() { SalesPerson *p, x( ); SalesEngineer y( ), m( ); p = &x; cout << "x's bonus: " << p->bonus() << endl; p = &y; cout << "y's bonus: " << p->bonus() << endl; p = &m; cout << "m's bonus: " << p->bonus() << endl; return(0); 其中,p 是父类 SalesPerson 之对象指针, 能指向 SalesPerson 类别之对象, 也能指向子类 SalesEngineer 之对象 例如 : p = &x; 令 p 指向 SalesPerson 之对象 x 再如 : p = &y; 令 p 指向子类 SalesEngineer 之对象 y 兹介绍个重要观念, 指令 p = &x; cout << p->bonus() << "\n"; 这 bonus() 为 SalesPerson 类别之 bonus() 或是 SalesEngineer 类别之 bonus() 呢? 答案是 :SalesPerson 类别之 bonus() 计算机根据两个线索判断之 : (1) p 之型态为 SalesPerson * (2) p 所指之对象 x, 其型态为 SalesPerson 因之, 此 bonus() 是 SalesPerson 类别之 bonus() 函数, 亦即 p->bonus() 相当于 x.bonus() 接下来, 就别有奥妙了!请看指令 p = &y; cout << p->bonus() << "\n"; 这 bonus() 为 SalesPerson 类别之 bonus() 或 SalesEngineer 类别之 bonus() 呢
31 第 6 章抽象類別 155? y 为 SalesEngineer 之对象, 而 SalesEngineer 类别中含有两个 bonus() 定义, 其中 SalesPerson::bonus() 是由 SalesPerson 继承而来, 而 SalesEngineer 类别也定义新 bonus() 函数 因之, 上述 p->bonus() 是相当于下列之何者呢? 或者 : 请看两个可能线索 : y.bonus() y.salesperson::bonus() (1) p 之型态为 SalesPerson * (2) p 所指之对象 y, 其型态为 SalesEngineer 这两线索不一致, 该怎么办呢? C++ 提供两种可能让您抉择, 以便选取最合适者 如果您希望计算机依指针 p 之型态来决定, 那么 C++ 就采用 早期连结 (Early Binding) 方法, 使得指令 : 相当于 p = &y; cout << p->bonus() << "\n"; p = &y; cout << y.salesperson::bonus() << "\n"; 亦即, 计算机根据 p 之型态来判断此 bonus() 应为 SalesPerson 类别之 bonus() 函数 如果您希望计算机依 p 所指向对象之型态来决定, 那么 C++ 就采用 晚期 连结 方法, 使得指令 : 相当于 p = &y; cout << p->bonus() << "\n"; p = &y; cout << y.bonus() << "\n"; 亦即, 计算机根据 p 所指向对象之型态来判断此 bonus() 函数应为 SalesEngineer 类别之 bonus() 话说回来, 在程序中, 应如何告诉计算机采用 早期 或 晚 期 连结呢?很简单, 如果您宣告 bonus() 为 虚拟函数 (Virtual Function), 计算机就采用晚期连结 反之, 若未宣告 bonus() 为虚拟函数, 计算机就采用早期连结 如果需做晚期连结 (Late Binding), 必须了解虚拟函数 (Virtual Function) 本
32 156 Android 的對象技術 (OOP) 节将介绍晚期连结与虚拟函数观念 宣告虚拟函数的方法是 : 于父类中使用专用字 virtual 宣告之 被宣告为 虚拟 之多型函数, 计算机会做晚期连结 例如 : //cx06-03.cpp #include <iostream.h> class SalesPerson { double total_amount; public: SalesPerson( double a ):total_amount(a) { virtual double bonus() const { return( total_amount * ); ; class SalesEngineer:public SalesPerson { public: SalesEngineer( double a ): SalesPerson(a) { ; double bonus() const { return( SalesPerson::bonus() ); ; int main() { SalesPerson *p, x( ); SalesEngineer y( ), m( ); p = &x; cout << p->bonus() << "\n"; p = &y; cout << p->bonus() << "\n"; p = &m; cout << p->bonus() << "\n"; return(0); 父类 SalesPerson 宣告 bonus() 为虚拟函数, 则其子孙类别之 bonus() 函数皆 自动成为虚拟函数;因之, 只须在 SalesPerson 中使用 virtual 专用字即可 当然 您也能为 SalesEngineer 类别中的 bonus() 加上 virtual 字眼, 使得程序更清楚一些 由于 bonus() 为虚拟多型函数, 当计算机处理下述指令时, 就做晚期连结 p = &y; cout << p->bonus() << "\n"; 晚期连结会依照 p 所指向对象之型态选取适当之 bonus() 函数 于此例子 中,p 指向 y 对象,y 为 SalesEngineer 类别之对象, 于是此 bonus() 函数是指 SalesEngineer 之 bonus() 计算机就调用 SalesEngineer 之 bonus() 函数 如果去
33 第 6 章抽象類別 157 掉上述之 virtual 专用字, 则计算机会做早期连结 依照 p 之型态选取适当的 bonus() 函数, 而非依照 p 所指向对象之型态了 关于面向对象 C 制 目前的 LW_OOPC 并没有提供类别继承, 所以也无虚拟函数及晚期连结机 让高老师陪您登上 IT 生涯的巅峰 首席 IT 架构师的策略思考技术 Workshop 课程 上課 : 兩天 (12 小時 ) 學費 :RMB6,600 元 / 人指導 : 高煥堂先生內容 : 请参考
Microsoft Word - G3_BK_Ch09-8.doc
第 9 章类别层级的数据和函数 195 196 Android 的对象技术 (OOP) 第 9 章类别层级的数据和函数 197 第 9 章 类别层级 (Class-level) 的数据及函数 9.1 类别层级的数据 9.2 类别层级的函数 9.3 Android 的类别层级数据和函数之例 9.4 应用于 C/C++ 198 Android 的对象技术 (OOP) 9.1 类别层级的数据 类别层级 (Class-level)
Microsoft Word - G3_BK_Ch08-8.doc
第 8 章纯粹抽象类别与接口 173 174 Android 的对象技术 (OOP) Android 的對象技術教材下載 第 8 章纯粹抽象类别与接口 175 第 8 章 纯粹抽象类别 与接口 (Interface) 8.1 认识 纯粹抽象类别 8.2 从 纯粹抽象类别 到 接口 8.3 Android 的接口之例 8.4 应用于 C/C++ 176 Android 的对象技术 (OOP) 8.1
Microsoft Word - GoF-ch02-8-hook-ok.doc
第 2 章 Android 框架與應用類別的接合 : 卡榫 (Hook) 函數 39 40 Google Android 設計招式之美 認識高煥堂老師 請看 4 分鐘演講視頻 第 2 章 Android 框架與應用類別的接合 : 卡榫 (Hook) 函數 41 第 2 章 Android 框架与应用 类别的接合 : 卡榫 (Hook) 函数 2.1 前言 2.2 何谓卡榫 (Hook) 函数 2.3
Microsoft Word - GoF-ch06-8-AbsFactory-ok.doc
第 6 章 Abstract Factory 樣式 137 138 Google Android 設計招式之美 Android 設計招式之美教材下載 第 6 章 Abstract Factory 樣式 139 第 6 章 Abstarct Factory 模式 6.1 Abstract Factory 模式美何在? 6.1.1 大格局的分合自如 6.1.2 不知而亦能用 之实践 6.2 介绍 Abstract
OOP with Java 通知 Project 4: 4 月 19 日晚 9 点
OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d
OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课
OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课 复习 Java 包 创建包 : package 语句, 包结构与目录结构一致 使用包 : import restaurant/ - people/ - Cook.class - Waiter.class - tools/ - Fork.class
建模与图形思考
C03_c 基 於 軟 硬 整 合 觀 點 JNI: 从 C 调 用 Java 函 数 ( c) By 高 煥 堂 3 How-to: 基 於 軟 硬 整 合 觀 點 从 C 调 用 Java 函 数 如 果 控 制 点 摆 在 本 地 C 层, 就 会 常 常 1. 从 本 地 C 函 数 去 调 用 Java 函 数 ; 2. 从 本 地 C 函 数 去 存 取 Java 层 对 象 的 属 性
OOP with Java 通知 Project 4: 5 月 2 日晚 9 点
OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d =
Mac Java import com.apple.mrj.*;... public class MyFirstApp extends JFrame implements ActionListener, MRJAboutHandler, MRJQuitHandler {... public MyFirstApp() {... MRJApplicationUtils.registerAboutHandler(this);
用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應
專題進度 老師 : 趙啟時老師 學生 : 陳建廷 2013/10/13 用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應 程式碼 : package com.example.phone; import java.util.arraylist;
エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******
******************* * 关于 Java 测试试题 ******************* 問 1 运行下面的程序, 选出一个正确的运行结果 public class Sample { public static void main(string[] args) { int[] test = { 1, 2, 3, 4, 5 ; for(int i = 1 ; i System.out.print(test[i]);
res/layout 目录下的 main.xml 源码 : <?xml version="1.0" encoding="utf 8"?> <TabHost android:layout_height="fill_parent" xml
拓展训练 1- 界面布局 1. 界面布局的重要性做应用程序, 界面是最基本的 Andorid 的界面, 需要写在 res/layout 的 xml 里面, 一般情况下一个 xml 对应一个界面 Android 界面布局有点像写 html( 连注释代码的方式都一样 ), 要先给 Android 定框架, 然后再在框架里面放控件,Android 提供了几种框架,AbsoluteLayout,LinearLayout,
詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入
100 年 特 種 考 試 地 方 政 府 公 務 人 員 考 試 試 題 等 別 : 三 等 考 試 類 科 : 資 訊 處 理 科 目 : 系 統 分 析 與 設 計 一 請 參 考 下 列 旅 館 管 理 系 統 的 使 用 案 例 圖 (Use Case Diagram) 撰 寫 預 約 房 間 的 使 用 案 例 規 格 書 (Use Case Specification), 繪 出 入
單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e
Android Studio Debugging 本篇教學除了最基本的中斷點教學之外, 還有條件式中斷的教學 條件式中斷是進階的除錯技巧, 在某些特定情況中, 我們有一個函數可能會被呼叫數次, 但是我們只希望在某種條件成立時才進行中斷, 進而觀察變數的狀態 而條件式中斷這項技巧正是符合這項需求 本教學分兩部分 單步除錯 (Page2~11, 共 10) 條件式中斷點 (Page12~17, 共 6)
软件工程文档编制
实训抽象类 一 实训目标 掌握抽象类的定义 使用 掌握运行时多态 二 知识点 抽象类的语法格式如下 : public abstract class ClassName abstract void 方法名称 ( 参数 ); // 非抽象方法的实现代码 在使用抽象类时需要注意如下几点 : 1 抽象类不能被实例化, 实例化的工作应该交由它的子类来完成 2 抽象方法必须由子类来进行重写 3 只要包含一个抽象方法的抽象类,
Microsoft Word - 01.DOC
第 1 章 JavaScript 简 介 JavaScript 是 NetScape 公 司 为 Navigator 浏 览 器 开 发 的, 是 写 在 HTML 文 件 中 的 一 种 脚 本 语 言, 能 实 现 网 页 内 容 的 交 互 显 示 当 用 户 在 客 户 端 显 示 该 网 页 时, 浏 览 器 就 会 执 行 JavaScript 程 序, 用 户 通 过 交 互 式 的
Android Service
Android Service- 播放音樂 建國科技大學資管系 饒瑞佶 2013/7 V1 Android Service Service 是跟 Activity 並行 一個音樂播放程式若沒使用 Service, 即使按 home 鍵畫面離開之後, 音樂還是照播 如果再執行一次程式, 新撥放的音樂會跟先前撥放的一起撥, 最後程式就會出錯 執行中的程式完全看不到! 但是, 寫成 Service 就不同了
untitled
1 Outline 數 料 數 數 列 亂數 練 數 數 數 來 數 數 來 數 料 利 料 來 數 A-Z a-z _ () 不 數 0-9 數 不 數 SCHOOL School school 數 讀 school_name schoolname 易 不 C# my name 7_eleven B&Q new C# (1) public protected private params override
Dynamic Layout in Android
Dynamic Layout in Android 建國科技大學資管系 饒瑞佶 2013/5 V1 Layout 多半都透過 res/layout/xml 格式設定來達成 Android 是 OOP, 所以可以動態產生 Layout 重點是 Layout 的階層關係 (Hierarchy) 需要處理對應事件 最後一樣用 setcontentview 加入 Layout 一 加入現有 Layout 中
无类继承.key
无类继承 JavaScript 面向对象的根基 周爱 民 / aimingoo [email protected] https://aimingoo.github.io https://github.com/aimingoo rand = new Person("Rand McKinnon",... https://docs.oracle.com/cd/e19957-01/816-6408-10/object.htm#1193255
<4D6963726F736F667420506F776572506F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>
程 序 设 计 实 习 INFO130048 3-2.C++ 面 向 对 象 程 序 设 计 重 载 继 承 多 态 和 聚 合 复 旦 大 学 计 算 机 科 学 与 工 程 系 彭 鑫 [email protected] 内 容 摘 要 方 法 重 载 类 的 继 承 对 象 引 用 和 拷 贝 构 造 函 数 虚 函 数 和 多 态 性 类 的 聚 集 复 旦 大 学 计 算 机 科 学
Database_001
作者 : 林致宇日期 :2011/10/26 主要參考來源 : http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applicat ions/ 問題 : 如在存取一個已經建立好的資料庫? 解答 : 有一些應用程式會需要讀取已經建立好的資料庫, 例如一個試題測驗應用程式, 裡面的試題可能已經於電腦上, 使用任何的
EJB-Programming-4-cn.doc
EJB (4) : (Entity Bean Value Object ) JBuilder EJB 2.x CMP EJB Relationships JBuilder EJB Test Client EJB EJB Seminar CMP Entity Beans Session Bean J2EE Session Façade Design Pattern Session Bean Session
C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1
C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,
Microsoft Word - 004_Android線程模式介紹.doc
Android 線程模式简介 基礎概念進程與線程在 Android 框架裡, 一個應用套件 (Application Package) 通常含有多個 Java 類 (Class), 這些類可以在同一個進程 (Process) 裡執行 ; 也可以在不同的進程裡執行 基於 Linux 的安全限制, 以及進程的基本特性 ( 例如, 不同進程的位址空間是獨立的 ), 如果兩個類 ( 或其對象 ) 在同一個進程裏執行時,
untitled
1 7 7.1 7.2 7.3 7.4 7.5 2 7.1 VFT virtual 7.1 3 1 1. 2. public protected public 3. VFT 4. this const volatile 4 2 5. ( ) ( ) 7.1 6. no-static virtual 7.2 7. inline 7.3 5 3 8. this this 9. ( ) ( ) delete
《大话设计模式》第一章
第 1 章 代 码 无 错 就 是 优? 简 单 工 厂 模 式 1.1 面 试 受 挫 小 菜 今 年 计 算 机 专 业 大 四 了, 学 了 不 少 软 件 开 发 方 面 的 东 西, 也 学 着 编 了 些 小 程 序, 踌 躇 满 志, 一 心 要 找 一 个 好 单 位 当 投 递 了 无 数 份 简 历 后, 终 于 收 到 了 一 个 单 位 的 面 试 通 知, 小 菜 欣 喜
Strings
Polymorphism and Virtual Functions Cheng-Chin Chiang Virtual Function Basics 多 型 (Polymorphism) 賦 予 一 個 函 數 多 種 意 涵, 存 在 於 同 一 類 別 之 內 祖 先 類 別 與 後 代 類 別 間 物 件 導 向 程 式 設 計 基 本 原 理 虛 擬 函 數 (Virtual Function)
FY.DOC
高 职 高 专 21 世 纪 规 划 教 材 C++ 程 序 设 计 邓 振 杰 主 编 贾 振 华 孟 庆 敏 副 主 编 人 民 邮 电 出 版 社 内 容 提 要 本 书 系 统 地 介 绍 C++ 语 言 的 基 本 概 念 基 本 语 法 和 编 程 方 法, 深 入 浅 出 地 讲 述 C++ 语 言 面 向 对 象 的 重 要 特 征 : 类 和 对 象 抽 象 封 装 继 承 等 主
1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET NET Framework.NET Framework 2.0 ( 3 ).NET Framework 2.0.NET F
1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET 2.0 2.0.NET Framework.NET Framework 2.0 ( 3).NET Framework 2.0.NET Framework ( System ) o o o o o o Boxing UnBoxing() o
java2d-4.PDF
75 7 6 G r a d i e n t P a i n t B a s i c S t r o k e s e t P a i n t ( ) s e t S t o r k e ( ) import java.awt.*; import java.awt.geom.*; public class PaintingAndStroking extends ApplicationFrame { public
主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new
ListView 自訂排版 主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new int[]{r.drawable.dog1, R.drawable.dog2,
SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基
开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些
javaexample-02.pdf
n e w. s t a t i c s t a t i c 3 1 3 2 p u b l i c p r i v a t e p r o t e c t e d j a v a. l a n g. O b j e c t O b j e c t Rect R e c t x 1 y 1 x 2 y 2 R e c t t o S t r i n g ( ) j a v a. l a n g. O
JavaIO.PDF
O u t p u t S t ream j a v a. i o. O u t p u t S t r e a m w r i t e () f l u s h () c l o s e () public abstract void write(int b) throws IOException public void write(byte[] data) throws IOException
Chapter 9: Objects and Classes
Fortran Algol Pascal Modula-2 BCPL C Simula SmallTalk C++ Ada Java C# C Fortran 5.1 message A B 5.2 1 class Vehicle subclass Car object mycar public class Vehicle extends Object{ public int WheelNum
Microsoft Word - G3_BK_Ch11-8.doc
第 11 章集合类别 225 226 Android 的对象技术 (OOP) Android 的对象技术教材下载 第 11 章集合类别 227 11 章 集合类别 11.1 集合对象 11.2 迭代器 (Iterator) 11.3 多态性集合对象 11.4 Android 的集合对象之例 (1) 11.5 Android 的集合对象之例 (2) 11.6 应用于 C/C++ 228 Android
(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit
Tomcat Web JUnit Cactus JUnit Java Cactus JUnit 26.1 JUnit Java JUnit JUnit Java JSP Servlet JUnit Java Erich Gamma Kent Beck xunit JUnit boolean JUnit Java JUnit Java JUnit Java 26.1.1 JUnit JUnit How
全国计算机技术与软件专业技术资格(水平)考试
全 国 计 算 机 技 术 与 软 件 专 业 技 术 资 格 ( 水 平 ) 考 试 2008 年 上 半 年 程 序 员 下 午 试 卷 ( 考 试 时 间 14:00~16:30 共 150 分 钟 ) 试 题 一 ( 共 15 分 ) 阅 读 以 下 说 明 和 流 程 图, 填 补 流 程 图 中 的 空 缺 (1)~(9), 将 解 答 填 入 答 题 纸 的 对 应 栏 内 [ 说 明
Swing-02.pdf
2 J B u t t o n J T e x t F i e l d J L i s t B u t t o n T e x t F i e l d L i s t J F r a m e 21 2 2 Swing C a n v a s C o m p o n e n t J B u t t o n AWT // ToolbarFrame1.java // java.awt.button //
Microsoft Word - 物件導向編程精要.doc
Essential Object-Oriented Programming Josh Ko 2007.03.11 object-oriented programming C++ Java OO class object OOP Ruby duck typing complexity abstraction paradigm objects objects model object-oriented
多媒體應用 13 新增專案並完成版面配置 <ExMusic01> <activity_main.xml> ImageView ID imgplay ImageView ID imgstop ImageView ID imgfront TextView ID txtsong TextView ID t
設定存取 SD 卡的權限 SD SD 13.1.4
<4D6963726F736F667420576F7264202D20C8EDC9E82DCFC2CEE7CCE22D3039C9CF>
全 国 计 算 机 技 术 与 软 件 专 业 技 术 资 格 ( 水 平 考 试 2009 年 上 半 年 软 件 设 计 师 下 午 试 卷 ( 考 试 时 间 14:00~16:30 共 150 分 钟 请 按 下 述 要 求 正 确 填 写 答 题 纸 1. 在 答 题 纸 的 指 定 位 置 填 写 你 所 在 的 省 自 治 区 直 辖 市 计 划 单 列 市 的 名 称 2. 在 答
Guava学习之Resources
Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于
提问袁小兵:
C++ 面 试 试 题 汇 总 柯 贤 富 管 理 软 件 需 求 分 析 篇 1. STL 类 模 板 标 准 库 中 容 器 和 算 法 这 部 分 一 般 称 为 标 准 模 板 库 2. 为 什 么 定 义 虚 的 析 构 函 数? 避 免 内 存 问 题, 当 你 可 能 通 过 基 类 指 针 删 除 派 生 类 对 象 时 必 须 保 证 基 类 析 构 函 数 为 虚 函 数 3.
Strings
Inheritance Cheng-Chin Chiang Relationships among Classes A 類 別 使 用 B 類 別 學 生 使 用 手 機 傳 遞 訊 息 公 司 使 用 金 庫 儲 存 重 要 文 件 人 類 使 用 交 通 工 具 旅 行 A 類 別 中 有 B 類 別 汽 車 有 輪 子 三 角 形 有 三 個 頂 點 電 腦 內 有 中 央 處 理 單 元 A
Microsoft PowerPoint - ch6 [相容模式]
UiBinder [email protected] UiBinder Java GWT UiBinder XML UI i18n (widget) 1 2 UiBinder HelloWidget.ui.xml: UI HelloWidgetBinder HelloWidget.java XML UI Owner class ( Composite ) UI XML UiBinder: Owner
新版 明解C++入門編
511!... 43, 85!=... 42 "... 118 " "... 337 " "... 8, 290 #... 71 #... 413 #define... 128, 236, 413 #endif... 412 #ifndef... 412 #if... 412 #include... 6, 337 #undef... 413 %... 23, 27 %=... 97 &... 243,
CHAPTER VC#
1. 2. 3. 4. CHAPTER 2-1 2-2 2-3 2-4 VC# 2-5 2-6 2-7 2-8 Visual C# 2008 2-1 Visual C# 0~100 (-32768~+32767) 2 4 VC# (Overflow) 2-1 2-2 2-1 2-1.1 2-1 1 10 10!(1 10) 2-3 Visual C# 2008 10! 32767 short( )
建立Android新專案
Android 智 慧 型 手 機 程 式 設 計 Android WebService 建 國 科 技 大 學 資 管 系 饒 瑞 佶 2012/4 V1 2012/8 V2 2013/5 V3 2014/10 v4 提 醒 這 節 的 內 容 針 對 的 是 MS 的 Web Service 或 是 使 用 SOAP(Simple Object Access Protocol) 標 準 建 立
Microsoft Word - Broker.doc
Broker 模式 采用 broker 模式对分布式计算进行简单模拟 系统在一个进程内模拟分布式环境, 因此不涉及网络编程和进程间通信,Broker 通过本地函数调用的方式实现 request 和 response 的转发 采用 broker 模式对分布式计算进行简单的模拟, 要求如下 : 设计四个 server, 一个 server 接收两个整数, 求和并返回结果, 一个 server 接收两个整数,
Microsoft Word - JAVA3.rtf
Java2 lesson The aim of this lesson is concept and method. ( 赵 卓 宁 ) 教 学 计 划 学 习 进 度 Java 3 6.1~6.34 内 容 介 绍 教 材 内 容 : 第 六 课 描 绘 的 层 次 和 关 系 主 要 议 程 1. 的 复 用 2. 的 继 承 3. 关 于 多 态 4. 应 用 约 束 ( 封 装 ) 5. 接
Microsoft Word - ch04三校.doc
4-1 4-1-1 (Object) (State) (Behavior) ( ) ( ) ( method) ( properties) ( functions) 4-2 4-1-2 (Message) ( ) ( ) ( ) A B A ( ) ( ) ( YourCar) ( changegear) ( lowergear) 4-1-3 (Class) (Blueprint) 4-3 changegear
PowerPoint 簡報
Paint 繪圖板 JAVA 程式設計 指導老師 : 鄞宗賢 組員 : 4A3G0901 劉彥佐 4A3G0907 韓偉志 畫面預覽 匯入參數 package paint; import java.awt.*; import java.awt.event.*; import javax.swing.*; 主程式 public class paint{ public static void main(string[]
1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10
Java V1.0.1 2007 4 10 1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10 6.2.10 6.3..10 6.4 11 7.12 7.1
C/C++程序设计 - 字符串与格式化输入/输出
C/C++ / Table of contents 1. 2. 3. 4. 1 i # include # include // density of human body : 1. 04 e3 kg / m ^3 # define DENSITY 1. 04 e3 int main ( void ) { float weight, volume ; int
Android 编程基础 Android 开发教程 & 笔记 1
Android 开发教程 & 笔记 1 多式样 ProgressBar 撰写 : 地狱怒兽 联系 :[email protected] 普通圆形 ProgressBar 该类型进度条也就是一个表示运转的过程, 例如发送短信, 连接网络等等, 表示一个过程正 在执行中 一般只要在 XML 布局中定义就可以了
内 容 简 介 本 书 是 一 本 关 于 语 言 程 序 设 计 的 教 材, 涵 盖 了 语 言 的 基 本 语 法 和 编 程 技 术, 其 中 包 含 了 作 者 对 语 言 多 年 开 发 经 验 的 总 结, 目 的 是 让 初 学 的 读 者 感 受 到 语 言 的 魅 力, 并 掌
语 言 程 序 设 计 郑 莉 胡 家 威 编 著 清 华 大 学 逸 夫 图 书 馆 北 京 内 容 简 介 本 书 是 一 本 关 于 语 言 程 序 设 计 的 教 材, 涵 盖 了 语 言 的 基 本 语 法 和 编 程 技 术, 其 中 包 含 了 作 者 对 语 言 多 年 开 发 经 验 的 总 结, 目 的 是 让 初 学 的 读 者 感 受 到 语 言 的 魅 力, 并 掌 握 语
Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,
http://debut.cis.nctu.edu.tw/~chi Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0, : POSITIVE_INFINITY NEGATIVE_INFINITY
1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:
Chapter 15. Suppressed Exception CH14 Finally Block Java SE 7 try-with-resources JVM cleanup try-with-resources JVM cleanup cleanup Java SE 7 Throwable getsuppressed Throwable[] getsuppressed() Suppressed
RxJava
RxJava By 侦跃 & @hi 头 hi RxJava 扩展的观察者模式 处 观察者模式 Observable 发出事件 Subscriber 订阅事件 bus.post(new AnswerEvent(42)); @Subscribe public void onanswer(answerevent event) {! }! Observable observable = Observable.create(new
<4D6963726F736F667420506F776572506F696E74202D20B5DA3035D5C220C3E6CFF2B6D4CFF3B8DFBCB6B3CCD0F2C9E8BCC6>
Java 程 序 设 计 教 学 课 件 河 南 农 业 大 学 信 管 学 院 计 算 机 系 河 南 农 业 大 学 信 管 学 院 计 算 机 系 高 级 语 言 程 序 设 计 课 程 组 第 5 章 面 向 对 象 高 级 程 序 设 计 主 要 内 容 5.1 继 承 5.2 多 态 性 5.3 抽 象 类 和 抽 象 方 法 5.4 接 口 5.5 内 部 类 和 匿 名 类 5.1
前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii
前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii C# 7 More Effective C# C# C# C# C# C# Common Language Runtime CLR just-in-time
附录J:Eclipse教程
附 录 J:Eclipse 教 程 By Y.Daniel Liang 该 帮 助 文 档 包 括 以 下 内 容 : Eclipse 入 门 选 择 透 视 图 创 建 项 目 创 建 Java 程 序 编 译 和 运 行 Java 程 序 从 命 令 行 运 行 Java Application 在 Eclipse 中 调 试 提 示 : 在 学 习 完 第 一 章 后 使 用 本 教 程 第
基于CDIO一体化理念的课程教学大纲设计
Java 语 言 程 序 设 计 课 程 教 学 大 纲 Java 语 言 程 序 设 计 课 程 教 学 大 纲 一 课 程 基 本 信 息 1. 课 程 代 码 :52001CC022 2. 课 程 名 称 :Java 语 言 程 序 设 计 3. 课 程 英 文 名 称 :Java Programming 4. 课 程 类 别 : 理 论 课 ( 含 实 验 上 机 或 实 践 ) 5. 授
C/C++语言 - C/C++数据
C/C++ C/C++ Table of contents 1. 2. 3. 4. char 5. 1 C = 5 (F 32). 9 F C 2 1 // fal2cel. c: Convert Fah temperature to Cel temperature 2 # include < stdio.h> 3 int main ( void ) 4 { 5 float fah, cel ;
题目
开发 Android 应用 目的 : 帮助大家了解 Android 平台开发 作者 : 王威威 技术爱好 : linux,qt, 嵌入式开发 MSN : [email protected] Email : [email protected] [email protected] 下载开发资源 1 下载最新的 Android SDK http://code.google.com/android/download.html
预览图 : (2) 在 SelectCity.java 中增加控件, 用于绑定 select_city 文件的 ListView, TextView,EditTest 等控件 代码和注释如下 :
EditText 实现城市搜索 1801210778 邹宇航 摘要 : 使用 EditText 实现搜索城市的功能, 以此为依据更新 ListView 1. 效果图 : 2. 主要步骤 (1) 在 select-city.xml 布局文件中中添加 EditText 控件用作搜索框, 然后添加 ListView 控件用来显示城市名字内容 代码如下 : 预览图 : (2) 在 SelectCity.java
