日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

继承之后的使用注意事项_ArrayStoreException

發布時間:2025/7/14 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 继承之后的使用注意事项_ArrayStoreException 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天在看Core In Java第五章節時,看到一個很感興趣的知識點,如下:?

在Java中,子類數組的引用可以轉換成超類數組的引用,而不需要采用強制轉換。但是,在超類數組的引用添加超類類型引用對象之后,就會出錯(ArrayStoreException)!代碼如下:?

Java代碼??
  • /**?
  • ?*?在第五章節繼承中提到了一個很重要的概念?
  • ?*??
  • ?*?確切的講是一個繼承使用時的忌諱?
  • ?*??
  • ?*?使用子類類型定義一個數組,然后讓一個父類類型數組引用,在父類數組中添加父類類型對象,將出錯?
  • ?*??
  • ?*?ArrayStoreException?
  • ?*??
  • ?*?@author?Administrator?
  • ?*??
  • ?*/??
  • public?class?ArrayStoreExceptionTest?{??
  • ??
  • ????/**?
  • ?????*?測試在繼承中的注意事項及忌諱?
  • ?????*??
  • ?????*?@param?args?
  • ?????*/??
  • ????public?static?void?main(String[]?args)?{??
  • ????????Student[]?students?=?new?Student[10];??
  • ????????Person[]?persons?=?students;??
  • ????????//?內部類的實例化過程??
  • ????????Person?p1?=?new?ArrayStoreExceptionTest().new?Person(1001,?"Jessica");??
  • ????????persons[0]?=?p1;??
  • ????????students[0].setScore(200.1);??
  • ????}??
  • ??
  • ????/**?
  • ?????*?Super?class?Person?
  • ?????*??
  • ?????*?@author?Administrator?
  • ?????*??
  • ?????*/??
  • ????class?Person?{??
  • ????????private?int?id;??
  • ??
  • ????????private?String?name;??
  • ??
  • ????????public?int?getId()?{??
  • ????????????return?id;??
  • ????????}??
  • ??
  • ????????public?void?setId(int?id)?{??
  • ????????????this.id?=?id;??
  • ????????}??
  • ??
  • ????????public?String?getName()?{??
  • ????????????return?name;??
  • ????????}??
  • ??
  • ????????public?void?setName(String?name)?{??
  • ????????????this.name?=?name;??
  • ????????}??
  • ??
  • ????????public?Person(int?id,?String?name)?{??
  • ????????????super();??
  • ????????????this.id?=?id;??
  • ????????????this.name?=?name;??
  • ????????}??
  • ??
  • ????????public?Person()?{??
  • ????????????super();??
  • ????????}??
  • ??
  • ????}??
  • ??
  • ????/**?
  • ?????*?Subclass?Student?
  • ?????*??
  • ?????*?@author?Administrator?
  • ?????*??
  • ?????*/??
  • ????class?Student?extends?Person?{??
  • ????????private?double?score;??
  • ??
  • ????????public?Student(int?id,?String?name,?double?score)?{??
  • ????????????super(id,?name);??
  • ????????????this.score?=?score;??
  • ????????}??
  • ??
  • ????????public?double?getScore()?{??
  • ????????????return?score;??
  • ????????}??
  • ??
  • ????????public?void?setScore(double?score)?{??
  • ????????????this.score?=?score;??
  • ????????}??
  • ????}??
  • }??


  • 以上代碼中,在main()方法中的代碼可以正常編譯通過,在運行時將拋出一個ArrayStoreException的運行時異常,原因是:由于persons超類數組對象的引用指向了students子類數組對象的引用,當為persons[0]添加父類對象引用時,將出現這樣的情況:JVM會進行檢查,由于引用的是子類數組類型對象引用,添加父類引用類型對象如果可以通過,在以下語句將出現更嚴重的異常!?

    Java代碼??
  • students[0].setScore(200.1);??
  • //將會訪問一個不存在的實例域,進而攪亂相鄰存儲空間的內容!??


  • 所以,以上代碼塊執行之后,將拋出ArrayStoreException,這是一個運行時異常的子類異常!這是使用繼承之后的一種忌諱!一定要注意避免!?

    Java代碼??
  • Exception?in?thread?"main"?java.lang.ArrayStoreException:??
  • ??
  • com.harry.coreInJava.chap5.ArrayStoreExceptionTest$Person??
  • ??
  • at?com.harry.coreInJava.chap5.ArrayStoreExceptionTest.main??
  • ??
  • (ArrayStoreExceptionTest.java:30)??



  • 所以,如果定義的是一個數組類型對象,則有必要記住這個對象中可以添加什么類型的對象,而不是因為繼承關系而擾亂了我們的判斷力!

    總結

    以上是生活随笔為你收集整理的继承之后的使用注意事项_ArrayStoreException的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。