第5章-内部类与异常类课件

上传人:仙*** 文档编号:241645469 上传时间:2024-07-12 格式:PPT 页数:43 大小:249.51KB
返回 下载 相关 举报
第5章-内部类与异常类课件_第1页
第1页 / 共43页
第5章-内部类与异常类课件_第2页
第2页 / 共43页
第5章-内部类与异常类课件_第3页
第3页 / 共43页
点击查看更多>>
资源描述
第第5 5章章 内部类与内部类与异常异常类类本章要点本章要点内部类内部类匿名类匿名类异常类异常类 内部类内部类 Java支支持持在在一一个个类类中中声声明明另另一一个个类类,这这样样的的类类称称作作内内部部类类,而而包包含含内内部部类类的的类类成成为为内内部部类类的的外外嵌类嵌类。某某种种类类型型的的农农场场饲饲养养了了一一种种特特殊殊种种类类的的牛牛,但但不不希希望望其其他他农农场场饲饲养养这这种种特特殊殊种种类类的的牛牛,那那么么这这种种类类型型的的农农场场就就可可以以将将创创建建这这种种特特殊殊种种牛牛的的类类作为自己的内部类。作为自己的内部类。例例有有一一个个RedCowFarm(红红牛牛农农场场)类类,该该类中有一个名字为类中有一个名字为RedCow(红牛)的内部类。红牛)的内部类。publicclassRedCowFarmstaticStringfarmName;RedCowcow;/内部类声明对象内部类声明对象RedCowFarm()RedCowFarm(Strings)cow=newRedCow(150,112,5000);farmName=s;publicvoidshowCowMess()cow.speak();classRedCow/内部类的声内部类的声明明StringcowName=红牛红牛;intheight,weight,price;RedCow(inth,intw,intp)height=h;weight=w;price=p;voidspeak()System.out.println(偶是偶是+cowName+,身高身高:+height+cm体重体重:+weight+kg,生活在生活在+farmName);/内部类结束内部类结束public class Example public static void main(String args)RedCowFarm farm=new RedCowFarm(红牛农红牛农场场);farm.showCowMess();farm.cow.speak();/RedCowFarm.RedCow redCow=new RedCowFarm.RedCow(180,119,6000);/如果将内部类如果将内部类定义为定义为static,那么就可以用外部类名直接访问内部类的那么就可以用外部类名直接访问内部类的构造方法。构造方法。/redCow.speak();/如果将内部类定义为如果将内部类定义为static,那那么声明的内部类的对象也可以直接访问内部类的方法。么声明的内部类的对象也可以直接访问内部类的方法。内部类举例内部类举例classOuterintouter_i=100;voidtest()/外部类的某个方法外部类的某个方法Innerin=newInner();/声明内部类的对象声明内部类的对象in.display();/调用内部类中的方法调用内部类中的方法classInnervoiddisplay()System.out.println(“display:outer_i:”+outer_i);/内部内部类访问外部类中的成员变量类访问外部类中的成员变量classInnerClassDemopublicstaticvoidmain(Stringargs)Outerout=newOuter();out.test();使用内部类的好处使用内部类的好处当一个类中要用到另一个类的实例对象,而另一个类中的代码又要访问第一个类中的成员,将另一个类做成第一个类的内部类,程序代码要容易编写。内部类和外嵌类之间的关系内部类和外嵌类之间的关系外嵌类中的成员变量在内部类中有效,内部类中的方法可以调用外嵌类中的方法。外嵌类可以用内部类声明对象,作为外嵌类的成员。内部类仅供外嵌类使用,其他类不可以用某个类的内部类声明对象。内部类可以用static修饰。匿名类匿名类 匿名匿名内部类就是内部类就是重写重写父类或接口的方法。父类或接口的方法。匿名内部类是没有名字的,所以没办法获得其匿名内部类是没有名字的,所以没办法获得其类型,而只能把它当作类型,而只能把它当作超类超类或或接口接口类型来使用。类型来使用。和子类有关的匿名类和子类有关的匿名类 JavaJava允允许许直直接接使使用用一一个个类类的的子子类类的的类类体体创创建建一一个个子类对象。子类对象。创创建建子子类类对对象象时时,除除了了使使用用父父类类的的构构造造方方法法外外还还有有类类体体,此此类类体体被被认认为为是是一一个个子子类类去去掉掉类类声声明明后后的的类类体,称作匿名类。体,称作匿名类。假假设设BankBank是是类类,那那么么下下列列代代码码就就是是用用BankBank的的一一个个子类子类(匿名匿名类)创建对象:类)创建对象:new Bank()new Bank()匿名类的类体匿名类的类体 ;abstractclassOutputAlphabet/输出字符的抽象类输出字符的抽象类publicabstractvoidoutput();publicclassOutputEnglishextendsOutputAlphabet/继承抽象继承抽象类类publicvoidoutput()/实现了抽象方法实现了抽象方法for(charc=a;c=z;c+)System.out.printf(“%3c”,c);/输出小写英文字母输出小写英文字母publicclassShowBoardvoidshowMess(OutputAlphabetshow)/上转型对象上转型对象show.output();publicclassExamplepublicstaticvoidmain(Stringargs)ShowBoardboard=newShowBoard();board.showMess(newOutputEnglish();/向参数传递向参数传递OutputAlphabet的子类对象的子类对象board.showMess(newOutputAlphabet()/向参数传递向参数传递OutputAlphabet的匿名子类对象,实现父类方法的匿名子类对象,实现父类方法publicvoidoutput()for(charc=;c Checked异常在程序中必须使用try.catch处理;v编译时不被检测的异常;-Runtime异常可以不使用try.catch处理,但一旦出现异常就将由JVM处理。异常的分类之异常的分类之RuntimeRuntime异常异常RuntimeException(运行时异常)是指因设计或实现方式不当而导致的问题.说白了,就是程序员程序员造成的,程序员小心谨慎是完全可以避免的异常.比如,事先判断对象是否为null就可以避免NullPointerException异常,事先检查除数不为0就可以避免ArithmeticException异常特点:这种异常Java编译器不会检查它,也就说程序中出现这类异常的时候,即使不处理也没有问题,但是一旦出现异常,程序将异常终止,若采用异常处理,则会被相应的程序执行处理.异常的分类之异常的分类之CheckedChecked异常异常除了RuntimeException以及子类,其他的Exception及其子类都是受检查异常,我们也可以称为非RuntimeException异常.特点:Java编译器会检查它,也就说程序中一旦出现这类异常,要么是用try-catch语句捕获,要么用throws语句声明抛出它,否则无法编译通过,也就是说这种异常,程序要求必须处理.处理异常的处理异常的5个关键字个关键字异常处理的5个关键字try,catch,finally throw,throws捕获异常:先捕获小异常再捕获大异常。捕获异常:先捕获小异常再捕获大异常。程序是调出来的,不是写出来的;多测试是程序员的必修程序是调出来的,不是写出来的;多测试是程序员的必修课。课。异常处理格式异常处理格式try/可能出异常的代码 catch(异常类 对象)/处理该异常类型的语句finally/一定会执行的代码/catch块使用System.exit(1);除外异常处理后,程序不会因为出现异常而退出当try语句块出现异常,程序会自动跳到catch语句块去找匹配的异常类型,并执行异常处理语句,finally语句块是异常的统一出口。public class TestExceptionpublic static void main(String args)tryint result=new Test().devide(3,0);System.out.println(the result is:+result);catch(Exception e)e.printStackTrace();System.out.println(“OK!End here!”);class Testpublic int devide(int x,int y)int result=x/y;return result;异常处理异常处理throws在可能出现异常的方法上声明抛出可能出现异常的类型:声明的时候尽可能声明具体的异常,方便更好的处理.当前方法不知道如何处理这种异常,可将该异常交给上一级调用者来处理(非RuntimeException类型的异常)。方法一旦使用throws声明抛出方法内可能出现的异常类型,该方法就可以不再过问该异常了;一个方法调用另一个使用throws声明抛出的方法,自己要么try.catch,要么也throws;public 返回返回值类值类型型 方法名方法名(参数列表参数列表.)throws 异常异常类类A,异常异常类类B.throwv自行抛出一个异常对象,抛出异常类的对象;若throw抛出的是Runtime异常:程序可以显示使用try.catch来捕获并处理,也可以不管,直接交给方法调用者处理;若throw抛出Checked异常:要么放在try里自己处理,要么放在一个throws声明的方法里面,交给调用者处理。public static void main(String args)try fn1(1);catch(Exception e)e.printStackTrace();fn2(2);public static void fn1(int a)throws Exceptionif(a 0)throw new Exception(fn1-a值不合法);public static void fn2(int a)if(a 0)throw new RuntimeException(a值不合法);throws&throwthrows用于在方法上声明该方法不需要处理的异常类型。throw用于抛出具体异常类的对象。throws与throw的区别:thorws用在方法上,后面跟异常类名,可以是多个异常类。throw用在方法内,后面跟异常对象,只能是一个。例 给出数据转换出现异常的情况下trycatch语句的用法publicclassExamplepublicstaticvoidmain(Stringargs)intn=0,m=0,t=1000;trym=Integer.parseInt(8888);n=Integer.parseInt(ab89);/发生异常发生异常,转向转向catcht=7777;/t没有机会被赋值没有机会被赋值catch(Exceptione)System.out.println(发生异常发生异常:+e.getMessage();System.out.println(n=+n+,m=+m+,t=+t);trySystem.out.println(故意抛出故意抛出I/O异常!异常!);thrownewjava.io.IOException(我是故意的我是故意的);/System.out.println(这个输出语句肯定没有机会执行这个输出语句肯定没有机会执行,所以必须注释掉,否则编译出错所以必须注释掉,否则编译出错);catch(java.io.IOExceptione)System.out.println(发生异常发生异常:+e.getMessage();Throwable中的方法String getMessage()获取异常信息,返回字符串。String toString()获取异常类名和异常信息,返回字符串。void printStackTrace()打印异常在堆栈中的跟踪信息;获取异常类名和异常信息,以及异常出现在程序中的位置。方便程序开发阶段的调试(一般要打开);JVM默认的异常处理机制;多异常处理多异常处理声明异常时尽可能声明具体异常类型,方便更好的处理;方法声明几个异常就对应有几个catch块;若多个catch块中的异常出现继承关系,父类异常catch块放在最后;在catch语句块使用Exception类作为异常类型时:所有子类实例都可以使用父类接收(向上转型),即所有的异常对象都可以使用Exception接收;注:在java处理多异常时捕获小范围的异常必须放在大范围异常之前。多异常处理格式多异常处理格式try/可能出异常的代码 catch(异常类A 对象)/处理异常类型A的语句catch(异常类B 对象)/处理异常类型B的语句.finally/一定会执行的代码/catch块使用System.exit(1);除外异常处理后,程序不会因为出现异常而退出当try语句块出现异常,程序会自动跳到catch语句块去找匹配的异常类型,并执行异常处理语句,finally语句块是异常的统一出口。方法覆写方法覆写-异常异常子类方法中声明抛出的异常类型是父类方法声明抛出异常类型的子类或相同类;也就是说:子类方法不能抛出新的异常类型;子类方法可以同时声明抛出多个父类方法声明抛出异常类的子类;(RuntimeException例外);class Super public void show()throws IOExceptionclass Sub extends Super public void show()throws FileNotFoundException,IOException,IllegalAccessException方法覆写原则方法覆写原则u子类中方法与父类方法有相同的返回值类型;u子类声明返回的类型也可以是父类声明返回类型的子类;u子类中方法与父类方法有相同的方法签名;u子类中方法的访问权限不能小于父类方法的访问权限;u子类方法不能抛出新的异常类型;u子类方法可以同时声明抛出多个父类方法声明抛出异常类的子类;(RuntimeException例外);u子类方法可以引发更少的异常,甚至可以不引发任何异常方法覆写方法覆写-异常异常public class RadioPlayer public void startPlaying()throws SoundException /body of method public class StereoPlayer extends RadioPlayer public void startPlaying()/body of method finallyv异常的统一出口:不管try块程序是否异常,也不管哪个catch执行,finally块总会执行。try语句块或会执行的catch语句块使用了JVM系统退出语句例外;/System.exit(1);try块必须和 catch块或和finally同在,不能单独存在,二者必须出现一个。自定义异常类自定义异常类 也也可可以以扩扩展展ExceptionException类类定定义义自自己己的的异异常常类类,然然后规定哪些方法产生这样的异常。后规定哪些方法产生这样的异常。一一个个方方法法在在声声明明时时可可以以使使用用throwsthrows关关键键字字声声明明要要产产生生的的若若干干个个异异常常,并并在在该该方方法法的的方方法法体体中中具具体体给给出出产产生生异异常常的的操操作作,即即用用相相应应的的异异常常类类创创建建对对象象,并并使使用用throwthrow关关键键字字抛抛出出该该异异常常对对象象,导导致致该该方方法法结结束执行。束执行。程序必须使用程序必须使用try-catch语句捕获能抛出异常的语句捕获能抛出异常的方法。方法。通通常常情情况况下下,计计算算两两个个整整数数之之和和的的方方法法不不应应当当有有任任何何异异常常发发生生,但但是是,对对某某些些特特殊殊应应用用程程序序,可可能能不不允允许许同同号号的的整整数数做做求求和和运运算算,比比如如当当一一个个整整数数代代表表收收入入,一一个个整整数数代代表表支支出出时时,这两个整数就不能是同号。这两个整数就不能是同号。例例,BankBank类类中中有有一一个个income(intincome(int in,intin,int out)out)方方法法,对对象象调调用用该该方方法法时时,必必须须向向参参数数inin传传递递正正整整数数、向向参参数数outout传传递递负负数数,并并且且int+outint+out必必须须大大于于等等于于0 0,否否则则该该方方法法就就抛抛出出异异常常。因因此此,BankBank类类在在声声明明income(intincome(int in,intin,int out)out)方方法法时时,使使用用throwsthrows关关键字声明要产生的异常。程序运行效果如图。键字声明要产生的异常。程序运行效果如图。publicclassBankprivateintmoney;publicvoidincome(intin,intout)throwsBankExceptionif(in=0|in+outmaxContent)thrownewDangerException();System.out.println(目前装载了目前装载了+realContent+吨货物吨货物);publicclassDangerExceptionextendsExceptionfinalStringmessage=超重超重;publicStringwarnMess()returnmessage;publicclassExamplepublicstaticvoidmain(Stringargs)CargoBoatship=newCargoBoat();ship.setMaxContent(1000);intm=600;tryship.loading(m);m=400;ship.loading(m);m=367;ship.loading(m);m=555;ship.loading(m);catch(DangerExceptione)System.out.println(e.warnMess();System.out.println(无法装载重量是无法装载重量是+m+吨的集装箱吨的集装箱);finallySystem.out.printf(货船将正点启航货船将正点启航);“”
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!