官术网_书友最值得收藏!

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能工作
主站蜘蛛池模板: 吴堡县| 横峰县| 镶黄旗| 河北区| 夹江县| 桐梓县| 高雄县| 青州市| 安泽县| 岳阳市| 吴忠市| 凤翔县| 金山区| 台南县| 锦屏县| 札达县| 开阳县| 平遥县| 新绛县| 正阳县| 湖北省| 台南县| 垦利县| 灵台县| 泉州市| 龙胜| 饶河县| 沐川县| 河西区| 姚安县| 常熟市| 晋宁县| 建平县| 莱西市| 桂东县| 灌阳县| 南木林县| 昌黎县| 双柏县| 清水河县| 铁岭市|