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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

多态的概念、对象上下转型、多态的应用、异常(异常概念、异常分类、java异常处理机制、try...catch...finally、throw和throws、自定义异常)

發(fā)布時(shí)間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多态的概念、对象上下转型、多态的应用、异常(异常概念、异常分类、java异常处理机制、try...catch...finally、throw和throws、自定义异常) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

多態(tài)的概念:

  • 多態(tài)性是指同一個(gè)操作作用于某一類(lèi)對(duì)象,可以有不同的解釋,產(chǎn)生不同的執(zhí)行結(jié)果。
  • 多態(tài)存在的三個(gè)必要條件: 需要存在繼承或?qū)崿F(xiàn)關(guān)系 同樣的方法調(diào)用而執(zhí)行不同的操作、運(yùn)行不同代碼(重寫(xiě)) 在運(yùn)行時(shí)父類(lèi)或者接口的引用變量可以引用其子類(lèi)的對(duì)象。
  • 多態(tài)的作用: 多態(tài)通過(guò)分離做什么和怎么做,從一個(gè)角度將接口和實(shí)現(xiàn)進(jìn)行分離。 多態(tài)消除了類(lèi)型之間的耦合關(guān)系 多態(tài)的存在提高了程序的拓展性和后期的可維護(hù)性。
abstract class Animal {abstract void eat(); } class dog extends Animal {void eat(){System.out.println("狗啃骨頭");} } class cat extends Animal {void eat(){System.out.println("貓吃魚(yú)");} } public class Main {public static void main(String[] args) {Animal an1=new dog();//在運(yùn)行時(shí)父類(lèi)或者接口的引用變量可以引用其子類(lèi)的對(duì)象。向上轉(zhuǎn)型Animal an2=new cat();an1.eat();an2.eat();} }

對(duì)象的上下轉(zhuǎn)型:

  • 由子類(lèi)轉(zhuǎn)換父類(lèi),在繼承圖上是向上移動(dòng)的,一般稱(chēng)為向上轉(zhuǎn)型
  • 向上轉(zhuǎn)型是從一個(gè)較專(zhuān)用類(lèi)型向通用類(lèi)型轉(zhuǎn)換,所以總是安全的,也就是說(shuō),子類(lèi)是父類(lèi)的超集
  • 向上轉(zhuǎn)型過(guò)程中,類(lèi)接口中唯一可能發(fā)生的事情是丟失方法,而不是獲取方法
  • 與之相反的操作是向下轉(zhuǎn)型,不安全(可能需要instanceof操作符協(xié)助)
  • instanceof運(yùn)算符用來(lái)在運(yùn)行時(shí)通過(guò)返回值來(lái)指出對(duì)象是否有特定類(lèi)或者它的子類(lèi)的一個(gè)實(shí)例。典型使用場(chǎng)合:在對(duì)對(duì)象做下轉(zhuǎn)型之前,沒(méi)有其他有關(guān)對(duì)象信息時(shí)務(wù)必使用instanceof來(lái)判斷一下,以避免拋出ClassCastException異常。用法如下:
result=object instanceof class result:布爾類(lèi)型 object:必選項(xiàng),任意對(duì)象表達(dá)式 class:必選項(xiàng),任意已定義的對(duì)象類(lèi) 說(shuō)明:如果object是class或其子類(lèi)的一個(gè)實(shí)例(引用),則instance運(yùn)算符返回true如果不是或者object是null,則返回false
  • 對(duì)象的上下轉(zhuǎn)型舉例:
abstract class Animal {abstract void eat(); } class dog extends Animal {void eat(){System.out.println("狗啃骨頭");}void sleep(){System.out.println("狗狗睡覺(jué)");} } class cat extends Animal {void eat(){System.out.println("貓吃魚(yú)");} } public class Main {public static void main(String[] args) {Animal an1=new dog();//在運(yùn)行時(shí)父類(lèi)或者接口的引用變量可以引用其子類(lèi)的對(duì)象。Animal an2=new cat();an1.eat();//an1.sleep();向上轉(zhuǎn)型過(guò)程中,類(lèi)接口中唯一可能發(fā)生的事情是丟失方法。這里就無(wú)法調(diào)用sleep方法//我感覺(jué)這里是因?yàn)楦割?lèi)沒(méi)有該方法,而子類(lèi)有這個(gè)方法,所以這個(gè)方法會(huì)丟失。an2.eat();//cat cat1=(cat)an1;這樣強(qiáng)制向下轉(zhuǎn)型會(huì)拋出異常if(an1 instanceof cat){System.out.println("可以轉(zhuǎn)型");cat cat1=(cat)an1;//在這里并沒(méi)有輸出,因?yàn)閍n1并不是cat或其子類(lèi)的一個(gè)實(shí)例(引用),}if(an2 instanceof cat){System.out.println("可以轉(zhuǎn)型");cat cat1=(cat)an2;//在這里有輸出,因?yàn)閍n2是cat的一個(gè)實(shí)例}} }
  • 不使用多態(tài)代碼示例:
class School {CaiSeDaYinJi c1;HeiBaiDaYinJi h1;void AnzhuangDaYinJi(CaiSeDaYinJi c1){this.c1=c1;}void AnzhuangDaYinJi(HeiBaiDaYinJi h1){this.h1=h1;}void ShiYongCaiSeDaYinJi(String context){c1.print(context);}void ShiYongHeiBaiDaYinJi(String context){h1.print(context);} } abstract class DaYinJi {String name;public DaYinJi(String name) {this.name=name;}abstract void print(String context); } class CaiSeDaYinJi extends DaYinJi {public CaiSeDaYinJi(String name) {super(name);}void print(String context) {System.out.println(this.name+"彩色打印:"+context);} } class HeiBaiDaYinJi extends DaYinJi {public HeiBaiDaYinJi(String name) {super(name);}void print(String context) {System.out.println(this.name+"黑白打印:"+context);} } public class Main {public static void main(String[] args) {CaiSeDaYinJi c1=new CaiSeDaYinJi("惠普1");HeiBaiDaYinJi h1=new HeiBaiDaYinJi("惠普2");School s=new School();s.AnzhuangDaYinJi(c1);s.AnzhuangDaYinJi(h1);s.ShiYongCaiSeDaYinJi("使用彩色打印打印");s.ShiYongHeiBaiDaYinJi("使用黑白打印打印"); }}
  • 將上述代碼改為多態(tài)的形式進(jìn)行編寫(xiě),方便代碼功能的添加使代碼耦合性更強(qiáng)。
class School {DaYinJi d1;void AnzhuangDaYinJi(DaYinJi d1){this.d1=d1;}void ShiYongDaYinJi(String context){d1.print(context);} } abstract class DaYinJi {String name;public DaYinJi(String name) {this.name=name;}abstract void print(String context); } class CaiSeDaYinJi extends DaYinJi {public CaiSeDaYinJi(String name) {super(name);}void print(String context) {System.out.println(this.name+"彩色打印:"+context);}} class HeiBaiDaYinJi extends DaYinJi {public HeiBaiDaYinJi(String name) {super(name);}void print(String context) {System.out.println(this.name+"黑白打印:"+context);} } public class Main {public static void main(String[] args) {CaiSeDaYinJi c1=new CaiSeDaYinJi("惠普1");HeiBaiDaYinJi h1=new HeiBaiDaYinJi("惠普2");School s=new School();s.AnzhuangDaYinJi(c1);s.ShiYongDaYinJi("使用彩色打印");s.AnzhuangDaYinJi(h1);s.ShiYongDaYinJi("使用黑白打印");} }

異常:

  • 異常概念、異常分類(lèi)、java異常處理機(jī)制、try…catch…finally、throw和throws、自定義異常

異常的概念:

  • 什么是異常? 所謂的異常是指在程序運(yùn)行的過(guò)程中發(fā)生的一些不正常事件(如:除0溢出,數(shù)組下標(biāo)越界,所要讀取的文件不存在)。
  • 異常導(dǎo)致的后果? java程序的執(zhí)行過(guò)程中如出現(xiàn)異常事件,可以生成一個(gè)異常類(lèi)對(duì)象,該異常對(duì)象封裝了異常事件的信息,并將其被提交給java運(yùn)行時(shí)系統(tǒng),這個(gè)過(guò)程稱(chēng)為拋出異常,不處理的話(huà)會(huì)直接導(dǎo)致程序直接中斷。
  • 如何防止程序中斷? 設(shè)計(jì)良好的程序應(yīng)該在程序異常發(fā)生時(shí)提供處理這些異常的方法,使得程序不會(huì)因?yàn)楫惓5陌l(fā)生而阻斷或產(chǎn)生不可預(yù)見(jiàn)的結(jié)果。
  • java異常的分類(lèi):分為errorExceptionerror: 這個(gè)異常時(shí)系統(tǒng)運(yùn)行java虛擬機(jī)的異常,和代碼沒(méi)有關(guān)系,這種異常我們一般處理不了,基本上都是要去檢查操作系統(tǒng)和檢查運(yùn)行環(huán)境。Exception: 這個(gè)異常我們能夠處理,分為IOExceptionRuntimeException
  • 除了上面的異常分類(lèi)之外我們還將異常分為以下類(lèi)別:
異常類(lèi)型包括來(lái)源處理
受檢查異常(checkException)Exception及其子類(lèi)(不包括RuntimeException)由代碼控制能力之外的因素導(dǎo)致的運(yùn)行時(shí)錯(cuò)誤必須要處理,否則通不過(guò)編譯
非受查異常(uncheckedException)Error和RuntimeException及其子類(lèi)RuntimeException一般代表編程錯(cuò)誤可以不用處理
  • 受檢查異常: 比如說(shuō):去讀取磁盤(pán)上某個(gè)文件,文件不存在或者要連接某個(gè)服務(wù)器而連不上,因?yàn)檫@些原因產(chǎn)生的異常就要處理,否則程序可能會(huì)運(yùn)行到一半時(shí)崩了。
  • 非受查異常: 比如說(shuō):java虛擬機(jī)運(yùn)行時(shí)的異常或者程序代碼里面類(lèi)似除數(shù)等于0這樣的異常或者多態(tài)處理上下轉(zhuǎn)型時(shí)的異常,這些都是編程時(shí)由于代碼問(wèn)題而導(dǎo)致的編程錯(cuò)誤,這種異常可以不用處理。
  • java異常處理機(jī)制: Try-catch-finally, try: 監(jiān)控區(qū)域,執(zhí)行可能產(chǎn)生異常的代碼。catch: 捕獲、處理異常。finally: 善后處理,無(wú)論是否發(fā)生異常,代碼總能執(zhí)行。try{}語(yǔ)句塊中放的代碼是要檢測(cè)的java代碼,可能會(huì)拋出異常,也可能會(huì)正常執(zhí)行。catch(異常類(lèi)型){}塊是當(dāng)java運(yùn)行時(shí)系統(tǒng)接收到try塊中所拋出異常對(duì)象時(shí),會(huì)尋找能處理這一異常catch塊來(lái)進(jìn)行處理(可能有多個(gè)catch塊)。finally{}不管系統(tǒng)有沒(méi)有拋出異常都會(huì)去執(zhí)行,除了在之前執(zhí)行了System.exit(0);一般用來(lái)釋放資源。這幾部分代碼塊里面的代碼變量是不相關(guān)的,相當(dāng)于局部變量吧。
  • Java里try catch的簡(jiǎn)單用法: ①try+catch: 程序的流程是:運(yùn)行到try塊中,如果有異常拋出,則轉(zhuǎn)到catch塊去處理。然后執(zhí)行catch塊后面的語(yǔ)句。②try+catch+finally: 程序的流程是:運(yùn)行到try塊中,如果有異常拋出,則轉(zhuǎn)到catch塊,catch塊執(zhí)行完畢后,執(zhí)行finally塊的代碼,再執(zhí)行finally塊后面的代碼。如果沒(méi)有異常拋出,執(zhí)行完try塊,也要去執(zhí)行finally塊的代碼。然后執(zhí)行finally塊后面的語(yǔ)句。③try+finally: 程序的流程是:運(yùn)行到try塊中,如果有異常拋出的話(huà),程序轉(zhuǎn)向執(zhí)行finally塊的代碼。那末finally塊后面的代碼還會(huì)被執(zhí)行嗎?不會(huì)!因?yàn)闆](méi)有處理異常,所以遇到異常后,執(zhí)行完finally后,方法就已拋出異常的方式退出了。
  • 下面是java異常處理的示例代碼:
import java.util.Scanner; class Person {String name; } public class Main {public static void main(String[] args) {int a=10;int b;int c;Scanner sc=new Scanner(System.in);Person p=null;System.err.println("請(qǐng)輸入除數(shù):");b=sc.nextInt();try{c=a/b;p.name="FHN";}catch(Exception e){ //Exception e這個(gè)是捕獲所有的異常,有了這句就不用寫(xiě)下面的catch了System.out.println("空指針異常,請(qǐng)檢查有沒(méi)有初始化指針!");} // catch(NullPointerException e){ // System.out.println("空指針異常,請(qǐng)檢查有沒(méi)有初始化指針!"); // } // catch(ArithmeticException e){ // System.out.println("除數(shù)為0,請(qǐng)檢查輸入的除數(shù),重新輸入!"); // b=sc.nextInt(); // c=a/b; // System.out.println("c="+c); // }finally{System.out.println("end");}System.out.println("end2");//如果在只用try和finally,在有異常時(shí)不會(huì)執(zhí)行到這句,程序在這句之前就退出了} }

throw和throws:

  • throw用于手動(dòng)拋出異常,作為程序員可以在任意位置手動(dòng)拋出異常。
  • throws用于在方法上標(biāo)識(shí)要暴露的異常,拋出的異常交由調(diào)用者處理。
  • 兩者區(qū)別: throw用在方法內(nèi),后面跟上要拋出的異常類(lèi)對(duì)象。throws修飾在方法上,告訴調(diào)用者此方法可能會(huì)拋出異常,后面跟上可能要拋出異常類(lèi)名。 throw:手動(dòng)拋出異常。throws:聲明方法可能要拋出異常。
  • 代碼示例:
class Bar {int age;public Bar(int age) {this.age=age;}void check ()throws IllegalArgumentException //throws修飾在方法上,告訴調(diào)用者此方法可能會(huì)拋出異常,后面跟上可能要拋出異常類(lèi)名。{if(age<18){throw new IllegalArgumentException("年紀(jì)太小");//年紀(jì)太小,會(huì)在異常拋出時(shí)顯示}} } public class Main {public static void main(String[] args) {Bar b=new Bar(15);try{b.check();}catch(IllegalArgumentException e){System.out.println(e.getMessage());e.printStackTrace();//顯示異常的數(shù)據(jù)}System.out.println("end");} }

自定義異常:

  • 常見(jiàn)異常:RuntimeException、IOException、SQLException、ClassNotFoundException
  • 自定義異常: java提供的異常體系不可能遇見(jiàn)所有加以報(bào)告的錯(cuò)誤
  • 自定義異常類(lèi)必須從已由的異常類(lèi)繼承。 建立新的異常類(lèi)型最簡(jiǎn)單的方法就是讓編譯器產(chǎn)生默認(rèn)構(gòu)造方法。 對(duì)于異常來(lái)說(shuō),最重要的部分就是它的類(lèi)名。 可以為異常類(lèi)定義一個(gè)接受字符串參數(shù)的構(gòu)造方法,字符串參數(shù)描述異常信息。
  • 下面是使用自己定義的異常類(lèi),來(lái)手動(dòng)拋出異常的代碼:
class Bar {int age;public Bar(int age) {this.age=age;}void check ()throws AgeLess //throws修飾在方法上,告訴調(diào)用者此方法可能會(huì)拋出異常,后面跟上可能要拋出異常類(lèi)名。{if(age<18){throw new AgeLess("年紀(jì)太小");//年紀(jì)太小,會(huì)在異常拋出時(shí)顯示}} } class AgeLess extends Exception //AgeLesss是自己定義的異常類(lèi),繼承自Exception,是首查異常 {private String message;public AgeLess(String message) {this.message=message;}public String getMessage() { //重寫(xiě)了父類(lèi)的getMessagereturn this.message;} } public class Main {public static void main(String[] args) {Bar b=new Bar(15);try{b.check();}catch(AgeLess e){System.out.println(e.getMessage());e.printStackTrace();//顯示異常的詳細(xì)數(shù)據(jù),這里是父類(lèi)的方法} System.out.println("end");} } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的多态的概念、对象上下转型、多态的应用、异常(异常概念、异常分类、java异常处理机制、try...catch...finally、throw和throws、自定义异常)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。