- Java面向?qū)ο筌浖_發(fā)
- 姚駿屏 汪衛(wèi)星主編
- 1847字
- 2018-12-29 19:04:17
2.2.6 對(duì)象之間的類型轉(zhuǎn)換
與基本數(shù)據(jù)類型之間的強(qiáng)制類型轉(zhuǎn)換類似,在Java語(yǔ)言中,有繼承關(guān)系的父類對(duì)象和子類對(duì)象之間也可以在一定條件下相互轉(zhuǎn)換。父類對(duì)象和子類對(duì)象的轉(zhuǎn)換需要注意以下原則:
(1)子類對(duì)象可以被視為是其父類的對(duì)象,反之則不可。
如B是A的子類,如下的用法是可以的:
A a = new B( );
也就是在使用的時(shí)候我們可以將用子類實(shí)例化的對(duì)象看成是父類的一個(gè)對(duì)象。但反過來,如下:
B b = new A( );
是不可以的。可以理解為,如果將父類和子類看做是兩個(gè)杯子,子類可以容納的細(xì)節(jié)更多,數(shù)據(jù)更多,相當(dāng)于一個(gè)大杯子,而父類是個(gè)小杯子。我們可以將大杯子裝小杯子的水也就是當(dāng)成小杯子用,但是不可能將小杯子裝大杯子的水當(dāng)大杯子用。
(2)若父類對(duì)象引用指向的實(shí)際是一個(gè)子類對(duì)象(在以前的某個(gè)時(shí)候根據(jù)(1)規(guī)則將子類對(duì)象當(dāng)成了父類對(duì)象用),則這個(gè)對(duì)象可以用強(qiáng)制類型轉(zhuǎn)換還原成子類對(duì)象。如上面已經(jīng)將子類B的對(duì)象當(dāng)成了父類對(duì)象用了,相當(dāng)于在大杯子上貼了個(gè)標(biāo)簽說它是小杯子,現(xiàn)在我們可以重新給它貼上大杯子的標(biāo)簽,還原它本來的面目。
A a = new B( ); B b = ( B )a;//還原成子類對(duì)象
【例2-9】 類對(duì)象之間的類型轉(zhuǎn)換的應(yīng)用。
class SuperClass{ // 父類 int a=5,b=8; void show(){ System.out.println("執(zhí)行父類SuperClass"); } } class SubClass extends SuperClass{ // 子類 int b=10; void show(){ System.out.println("執(zhí)行子類SubClass"); } } public class ClassExchangeDemo { public static void main(String[] args) { SuperClass super1,super2; // 聲明兩個(gè)父類對(duì)象 SubClass sub1,sub2; // 聲明兩個(gè)子類對(duì)象 super1=new SuperClass(); // 實(shí)例化第一個(gè)父類對(duì)象 System.out.println("super1.a="+super1.a+" super1.b="+super1.b); super1.show(); sub1=new SubClass(); // 實(shí)例化第一個(gè)子類對(duì)象 System.out.println("sub1.a="+sub1.a+" sub1.b="+sub1.b); sub1.show(); super2=sub1; // 根據(jù)原則(1):子類對(duì)象視為父類對(duì)象 System.out.println("super2.a="+super2.a+" super2.b="+super2.b); super2.show(); sub2=(SubClass)super2; // 根據(jù)原則(2):父類對(duì)象強(qiáng)制轉(zhuǎn)換為子類對(duì)象 System.out.println("sub2.a="+sub2.a+" sub2.b="+sub2.b); sub2.show(); } }
該程序的運(yùn)行結(jié)果如下:
super1.a=5 super1.b=8 執(zhí)行父類SuperClass sub1.a=5 sub1.b=10 執(zhí)行子類SubClass super2.a=5 super2.b=8 執(zhí)行子類SubClass sub2.a=5 sub2.b=10 執(zhí)行子類SubClass
工作分解-操作方案
1.分析抽象出類;
2.按照類圖編制出類框架;
3.實(shí)現(xiàn)類方法;
4.創(chuàng)建對(duì)象;
5.調(diào)用對(duì)象中的方法完成功能。
工作實(shí)施
1.分析抽象出類
從本任務(wù)中,可以分析出共有三個(gè)類:People類是父類,Student類和Teacher類都是People類的子類。People類有三個(gè)非私有屬性:姓名name、年齡age和默認(rèn)值為“工人”的身份id;三個(gè)公有成員方法:一個(gè)帶參構(gòu)造方法,用于初始化屬性值,一個(gè)表示“人”說話行為的方法talk(),以及表示“人”工作行為的方法work()。Student類除了從父類People繼承的成員外還新增了一個(gè)屬性:學(xué)號(hào)sNo;Teacher類除了從父類People繼承的成員外還新增了一個(gè)屬性:教師號(hào)tNo。
在UML中,繼承關(guān)系用一條從子類指向父類的空心三角箭頭表示,如圖2-6所示。

圖2-6 人(People)、學(xué)生(Student)和教師(Teacher)類圖及關(guān)系
2.按照類圖編制出類框架
/** *"人"類(是學(xué)生類和教師類的父類) */ class People { String name; // 姓名 int age; // 年齡 String id="工人"; // 默認(rèn)身份 public People(String name,int age){ // 構(gòu)造方法 } public void talk(){ // 說話行為 } public void work(){ // 工作行為 } } /** * 學(xué)生類,派生自People類 */ class Student extends People{ // 構(gòu)造方法 String sNo; // 學(xué)號(hào) String id="學(xué)生"; // 身份,父類同名的成員變量被隱藏 public Student(String name,int age,String sNo){ // 構(gòu)造方法 } } /** * 教師類,派生自People類 */ class Teacher extends People { String tNo; // 教師號(hào) String id="教師"; // 身份,父類同名的成員變量被隱藏 public Teacher(String name,int age,String tNo){ // 構(gòu)造方法 } }
3.實(shí)現(xiàn)類中的方法
// 實(shí)現(xiàn)People類中的方法 public People(String name,int age){ // 構(gòu)造方法 this.name = name; this.age = age; } public void talk(){ // 說話行為 System.out.println(name+"能說話"); } public void work(){ // 工作行為 System.out.println(name+"能工作"); } // 實(shí)現(xiàn)Student類中的方法 public Student(String name,int age,String sNo){ // 構(gòu)造方法 super(name,age); // 調(diào)用直接父類的構(gòu)造方法 this.sNo = sNo; } // 實(shí)現(xiàn)Teacher類中的方法 public Teacher(String name,int age,String tNo){ // 構(gòu)造方法 super(name,age); // 調(diào)用直接父類的構(gòu)造方法 this.tNo = tNo; }
4.定義主類
public class Test { public static void main(String[] args) { } }
5.創(chuàng)建類的對(duì)象
Student s=new Student("張三",18,"0900104"); // 創(chuàng)建學(xué)生類對(duì)象 Teacher t=new Teacher("lee",20,"2009001"); // 創(chuàng)建教師類對(duì)象
6.訪問對(duì)象
// 打印學(xué)生信息 System.out.println("學(xué)生信息:"); System.out.println("name = " + s.name + ", age = " + s.age + ", sNo = " + s.sNo + ", id = " + s.id); s.talk(); // 該方法繼承于父類 s.work(); // 該方法繼承于父類 // 打印教師信息 System.out.println("教師信息:"); System.out.println("name = " + t.name + ", age = " + t.age + ", tNo = " + t.tNo + ", id = " + t.id); t.talk(); // 該方法繼承于父類 t.work(); // 該方法繼承于父類
7.代碼調(diào)試并運(yùn)行
(1)完整源代碼如下:
class People { String name; // 姓名 int age; // 年齡 String id="工人"; // 身份 public People(String name, int age) { this.name = name; this.age = age; } public void talk(){ // 說話行為 System.out.println(name+"能說話"); } public void work(){ // 工作行為 System.out.println(name+"能工作"); } } /** * 學(xué)生類,派生自People類 */ class Student extends People{ // 構(gòu)造方法 String sNo; // 學(xué)號(hào) String id="學(xué)生"; // 身份,父類同名的成員變量被隱藏 public Student(String name,int age,String sNo){ // 構(gòu)造方法 super(name,age); // 調(diào)用直接父類的構(gòu)造方法 this.sNo = sNo; } } /** * 教師類,派生自People類 */ class Teacher extends People { String tNo; // 教師號(hào) String id="教師"; // 身份,父類同名的成員變量被隱藏 public Teacher(String name,int age,String tNo){ // 構(gòu)造方法 super(name,age); // 調(diào)用直接父類的構(gòu)造方法 this.tNo = tNo; } } public class Test { public static void main(String[] args) { Student s = new Student("張三", 18, "0900104"); System.out.println("學(xué)生信息:"); System.out.println("name = " + s.name + ", age = " + s.age + ", sNo = " + s.sNo + ", id = " + s.id); s.talk(); s.work(); Teacher t = new Teacher("lee", 20, "2009001"); System.out.println("教師信息:"); System.out.println("name = " + t.name + ", age = " + t.age + ", tNo = " + t.tNo + ", id = " + t.id); t.talk(); t.work(); } }
(2)調(diào)試結(jié)果:
學(xué)生信息: name= 張三,age=18,sNo=0900104,id= 學(xué)生 張三能說話 張三能工作 教師信息: name=lee,age=20,tNo=2009001,id= 教師 lee能說話 lee能工作
- 從零開始:數(shù)字圖像處理的編程基礎(chǔ)與應(yīng)用
- 碼上行動(dòng):零基礎(chǔ)學(xué)會(huì)Python編程(ChatGPT版)
- Java編程指南:基礎(chǔ)知識(shí)、類庫(kù)應(yīng)用及案例設(shè)計(jì)
- 3D少兒游戲編程(原書第2版)
- 青少年P(guān)ython編程入門
- 持續(xù)集成與持續(xù)交付實(shí)戰(zhàn):用Jenkins、Travis CI和CircleCI構(gòu)建和發(fā)布大規(guī)模高質(zhì)量軟件
- RubyMotion iOS Develoment Essentials
- Mastering Elixir
- 大學(xué)計(jì)算機(jī)基礎(chǔ)實(shí)驗(yàn)指導(dǎo)
- 石墨烯改性塑料
- Python數(shù)據(jù)可視化之matplotlib實(shí)踐
- Java Web 從入門到項(xiàng)目實(shí)踐(超值版)
- Python程序設(shè)計(jì)案例教程:從入門到機(jī)器學(xué)習(xí)(微課版)
- Visual C++.NET(2008)典型案例
- Learn Spring for Android Application Development