




已阅读5页,还剩38页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章内部类与异常类 本章要点 内部类匿名类异常类 内部类 Java支持在一个类中声明另一个类 这样的类称作内部类 而包含内部类的类成为内部类的外嵌类 某种类型的农场饲养了一种特殊种类的牛 但不希望其他农场饲养这种特殊种类的牛 那么这种类型的农场就可以将创建这种特殊种牛的类作为自己的内部类 例有一个RedCowFarm 红牛农场 类 该类中有一个名字为RedCow 红牛 的内部类 publicclassRedCowFarm staticStringfarmName 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 内部类结束 publicclassExample publicstaticvoidmain Stringargs RedCowFarmfarm newRedCowFarm 红牛农场 farm showCowMess farm cow speak RedCowFarm RedCowredCow newRedCowFarm RedCow 180 119 6000 如果将内部类定义为static 那么就可以用外部类名直接访问内部类的构造方法 redCow speak 如果将内部类定义为static 那么声明的内部类的对象也可以直接访问内部类的方法 内部类举例 classOuter intouter i 100 voidtest 外部类的某个方法Innerin newInner 声明内部类的对象in display 调用内部类中的方法 classInner voiddisplay System out println display outer i outer i 内部类访问外部类中的成员变量 classInnerClassDemo publicstaticvoidmain Stringargs Outerout newOuter out test 使用内部类的好处 当一个类中要用到另一个类的实例对象 而另一个类中的代码又要访问第一个类中的成员 将另一个类做成第一个类的内部类 程序代码要容易编写 内部类和外嵌类之间的关系 外嵌类中的成员变量在内部类中有效 内部类中的方法可以调用外嵌类中的方法 外嵌类可以用内部类声明对象 作为外嵌类的成员 内部类仅供外嵌类使用 其他类不可以用某个类的内部类声明对象 内部类可以用static修饰 匿名类 匿名内部类就是重写父类或接口的方法 匿名内部类是没有名字的 所以没办法获得其类型 而只能把它当作超类或接口类型来使用 和子类有关的匿名类 Java允许直接使用一个类的子类的类体创建一个子类对象 创建子类对象时 除了使用父类的构造方法外还有类体 此类体被认为是一个子类去掉类声明后的类体 称作匿名类 假设Bank是类 那么下列代码就是用Bank的一个子类 匿名类 创建对象 newBank 匿名类的类体 abstractclassOutputAlphabet 输出字符的抽象类publicabstractvoidoutput publicclassOutputEnglishextendsOutputAlphabet 继承抽象类publicvoidoutput 实现了抽象方法for charc a c z c System out printf 3c c 输出小写英文字母 publicclassShowBoard voidshowMess OutputAlphabetshow 上转型对象show output publicclassExample publicstaticvoidmain Stringargs ShowBoardboard newShowBoard board showMess newOutputEnglish 向参数传递OutputAlphabet的子类对象board showMess newOutputAlphabet 向参数传递OutputAlphabet的匿名子类对象 实现父类方法 publicvoidoutput for charc c c 输出希腊字母System out printf 3c c 在此结束方法调用 和接口有关的匿名类 假设Computable是一个接口 那么 Java允许直接用接口名和一个类体创建一个匿名对象 此类体被认为是实现了Computable接口的类去掉类声明后的类体 称作匿名类 下列代码就是用实现了Computable接口的类 匿名类 创建对象 newComputable 实现接口的匿名类的类体 下例演示了和接口有关的匿名类的用法 publicclassExample publicstaticvoidmain Stringargs HelloMachinemachine newHelloMachine machine turnOn newSpeakHello publicvoidspeak 实现接口中的方法System out println hello youarewelcome machine turnOn newSpeakHello publicvoidspeak 实现接口中的方法System out println 你好 欢迎光临 classHelloMachine publicvoidturnOn SpeakHellohello hello speak interfaceSpeakHello voidspeak 异常 异常就是程序在运行时出现的不正常情况 我们的写的程序不可能一帆风顺 若异常产生 却没进行正确的处理 则可能导致程序的中断 造成损失 所以我们在开发中要考虑到各种异常的发生 并对其作出正确的处理 确保程序的正常执行 了解异常 一旦出现异常 程序会立即终止 publicclassTestException publicstaticvoidmain Stringargs intresult newTest devide 3 0 System out println theresultis result classTest publicintdevide intx inty intresult x y returnresult 异常体系 异常体系 异常的体系ThrowableError通常指JVM出现重大问题如 运行的类不存在或者内存溢出等 不需要编写针对代码对其处理 程序无法处理 Exception在运行时运行出现的一些情况 可以通过try catch finally处理Exception和Error的子类名大都是以父类名作为后缀 Java在设计异常体系时 将容易出现的异常情况都封装成了对象 异常的分类 异常分类 编译时被检查异常 Checked异常在程序中必须使用try catch处理 编译时不被检测的异常 Runtime异常可以不使用try catch处理 但一旦出现异常就将由JVM处理 异常的分类之Runtime异常 RuntimeException 运行时异常 是指因设计或实现方式不当而导致的问题 说白了 就是程序员造成的 程序员小心谨慎是完全可以避免的异常 比如 事先判断对象是否为null就可以避免NullPointerException异常 事先检查除数不为0就可以避免ArithmeticException异常特点 这种异常Java编译器不会检查它 也就说程序中出现这类异常的时候 即使不处理也没有问题 但是一旦出现异常 程序将异常终止 若采用异常处理 则会被相应的程序执行处理 异常的分类之Checked异常 除了RuntimeException以及子类 其他的Exception及其子类都是受检查异常 我们也可以称为非RuntimeException异常 特点 Java编译器会检查它 也就说程序中一旦出现这类异常 要么是用try catch语句捕获 要么用throws语句声明抛出它 否则无法编译通过 也就是说这种异常 程序要求必须处理 处理异常的5个关键字 异常处理的5个关键字try catch finallythrow throws捕获异常 先捕获小异常再捕获大异常 程序是调出来的 不是写出来的 多测试是程序员的必修课 异常处理格式 try 可能出异常的代码 catch 异常类对象 处理该异常类型的语句 finally 一定会执行的代码 catch块使用System exit 1 除外 异常处理后 程序不会因为出现异常而退出 当try语句块出现异常 程序会自动跳到catch语句块去找匹配的异常类型 并执行异常处理语句 finally语句块是异常的统一出口 publicclassTestException publicstaticvoidmain Stringargs try intresult newTest devide 3 0 System out println theresultis result catch Exceptione e printStackTrace System out println OK Endhere classTest publicintdevide intx inty intresult x y returnresult 异常处理 throws 在可能出现异常的方法上声明抛出可能出现异常的类型 声明的时候尽可能声明具体的异常 方便更好的处理 当前方法不知道如何处理这种异常 可将该异常交给上一级调用者来处理 非RuntimeException类型的异常 方法一旦使用throws声明抛出方法内可能出现的异常类型 该方法就可以不再过问该异常了 一个方法调用另一个使用throws声明抛出的方法 自己要么try catch 要么也throws public返回值类型方法名 参数列表 throws异常类A 异常类B throw 自行抛出一个异常对象 抛出异常类的对象 若throw抛出的是Runtime异常 程序可以显示使用try catch来捕获并处理 也可以不管 直接交给方法调用者处理 若throw抛出Checked异常 要么放在try里自己处理 要么放在一个throws声明的方法里面 交给调用者处理 publicstaticvoidmain String args try fn1 1 catch Exceptione e printStackTrace fn2 2 publicstaticvoidfn1 inta throwsException if a 0 thrownewException fn1 a值不合法 publicstaticvoidfn2 inta if a 0 thrownewRuntimeException a值不合法 throws throw throws用于在方法上声明该方法不需要处理的异常类型 throw用于抛出具体异常类的对象 throws与throw的区别 thorws用在方法上 后面跟异常类名 可以是多个异常类 throw用在方法内 后面跟异常对象 只能是一个 例给出数据转换出现异常的情况下try catch语句的用法 publicclassExample publicstaticvoidmain Stringargs intn 0 m 0 t 1000 try m 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 try System out println 故意抛出I O异常 thrownewjava io IOException 我是故意的 System out println 这个输出语句肯定没有机会执行 所以必须注释掉 否则编译出错 catch java io IOExceptione System out println 发生异常 e getMessage Throwable中的方法 StringgetMessage 获取异常信息 返回字符串 StringtoString 获取异常类名和异常信息 返回字符串 voidprintStackTrace 打印异常在堆栈中的跟踪信息 获取异常类名和异常信息 以及异常出现在程序中的位置 方便程序开发阶段的调试 一般要打开 JVM默认的异常处理机制 多异常处理 声明异常时尽可能声明具体异常类型 方便更好的处理 方法声明几个异常就对应有几个catch块 若多个catch块中的异常出现继承关系 父类异常catch块放在最后 在catch语句块使用Exception类作为异常类型时 所有子类实例都可以使用父类接收 向上转型 即所有的异常对象都可以使用Exception接收 注 在java处理多异常时捕获小范围的异常必须放在大范围异常之前 多异常处理格式 try 可能出异常的代码 catch 异常类A对象 处理异常类型A的语句 catch 异常类B对象 处理异常类型B的语句 finally 一定会执行的代码 catch块使用System exit 1 除外 异常处理后 程序不会因为出现异常而退出 当try语句块出现异常 程序会自动跳到catch语句块去找匹配的异常类型 并执行异常处理语句 finally语句块是异常的统一出口 方法覆写 异常 子类方法中声明抛出的异常类型是父类方法声明抛出异常类型的子类或相同类 也就是说 子类方法不能抛出新的异常类型 子类方法可以同时声明抛出多个父类方法声明抛出异常类的子类 RuntimeException例外 classSuper publicvoidshow throwsIOException classSubextendsSuper publicvoidshow throwsFileNotFoundException IOException IllegalAccessException 方法覆写原则 子类中方法与父类方法有相同的返回值类型 子类声明返回的类型也可以是父类声明返回类型的子类 子类中方法与父类方法有相同的方法签名 子类中方法的访问权限不能小于父类方法的访问权限 子类方法不能抛出新的异常类型 子类方法可以同时声明抛出多个父类方法声明抛出异常类的子类 RuntimeException例外 子类方法可以引发更少的异常 甚至可以不引发任何异常 方法覆写 异常 publicclassRadioPlayer publicvoidstartPlaying throwsSoundException bodyofmethod publicclassStereoPlayerextendsRadioPlayer publicvoidstartPlaying bodyofmethod finally 异常的统一出口 不管try块程序是否异常 也不管哪个catch执行 finally块总会执行 try语句块或会执行的catch语句块使用了JVM系统退出语句例外 System exit 1 try块必须和catch块或和finally同在 不能单独存在 二者必须出现一个 自定义异常类 也可以扩展Exception类定义自己的异常类 然后规定哪些方法产生这样的异常 一个方法在声明时可以使用throws关键字声明要产生的若干个异常 并在该方法的方法体中具体给出产生异常的操作 即用相应的异常类创建对象 并使用throw关键字抛出该异常对象 导致该方法结束执行 程序必须使用try catch语句捕获能抛出异常的方法 通常情况下 计算两个整数之和的方法不应当有任何异常发生 但是 对某些特殊应用程序 可能不允许同号的整数做求和运算 比如当一个整数代表收入 一个整数代表支出时 这两个整数就不能是同号 例 Bank类中有一个income intin intout 方法 对象调用该方法时 必须向参数in传递正整数 向参数out传递负数 并且int out必须大于等于0 否则该方法就抛出异常 因此 Bank类在声明income intin intout 方法时 使用throws关键字声明要产生的异常 程序运行效果如图 publicclassBank privateintmoney publicvoidincome intin intout throwsBankException if in 0 in out 0 thrownewBankException in out 方法抛出异常 导致方法结束 intnetIncome in out System out printf 本次计算出的纯收入是 d元 n netIncome money money netIncome publicintgetMoney returnmoney publicclassBankExceptionextendsException Stringmessage publicBankException intm intn message 入账资金 m 是负数或支出 n 是正数 不符合系统要求 publicStringwarnMess returnmessage 2020 1 9 第40页 publicclassExample publicstaticvoidmain Stringargs Bankbank newBank try bank income 200 100 bank income 300 100 bank income 400 100 System out printf 银行目前有 d元 n bank getMoney bank income 200 100 bank income 99999 100 catch BankExceptione System out println 计算收益的过程出现如下问题 System out println e warnMess System out printf 银行目前有 d元 n bank getMoney 应用举例 带finally子语
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山东省滨州市十二校2025-2026学年数学高三上期末达标检测模拟试题
- 山东省日照市五莲县2025-2026学年数学高三上期末综合测试试题
- 山东省滨州市邹平县黄山中学2025年数学高三第一学期期末综合测试模拟试题
- 2025年会计题库真题及答案
- 药品检验员习题+答案
- 禁毒培训知识问答课件
- 2025内蒙古自治区妇幼保健院招聘紧缺急需高层次人才备考练习试题及答案解析
- 行政决策案例分析讲课文档
- 2025重庆市荣昌区招商投资促进局招聘公益性岗位人员2人备考练习试题及答案解析
- 施工作业人员安全教育培训考试试题(含答案)
- 社会调查与统计第四章抽样
- 不良资产尽职调查清单
- 《国际结算(第五版)》第九章 跨境贸易人民币结算
- 2022年云南师范大学辅导员招聘考试试题及答案解析
- 塑胶操场监理实施细则
- 中国电力优质工程奖评审办法
- 说专业(市场营销专业)课件
- 地铁车站导向标识安装安全技术交底
- 更换回转窑大齿圈施工方案
- 体能训练概论(NSCA)
- GB 38600-2019 养老机构服务安全基本规范
评论
0/150
提交评论