版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第六章 内部类与异常类浙江师范大学软件工程专业导读导读主要内容主要内容内部类内部类匿名类匿名类异常类异常类断言断言难点难点异常类异常类第六章 内部类与异常类浙江师范大学软件工程专业6.1 内部类内部类Java支持在一个类中声明另一个类,这样的类称作支持在一个类中声明另一个类,这样的类称作内部类内部类,而包含内部类的类成为内部类的,而包含内部类的类成为内部类的外嵌类外嵌类。 内部类的共性(1) 内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号。(2) 内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的
2、成员变量,无论是否是private的。(3) 内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量。第六章 内部类与异常类浙江师范大学软件工程专业例1 某种类型的农场饲养了一种特殊种类的牛,但不希望某种类型的农场饲养了一种特殊种类的牛,但不希望其他农场饲养这种特殊种类的牛,那么这种类型的农其他农场饲养这种特殊种类的牛,那么这种类型的农场就可以将创建这种特殊种牛的类作为自己的内部类。场就可以将创建这种特殊种牛的类作为自己的内部类。 下面的下面的例子例子1(Example7_1.java)中有一个中有一个RedCowForm(红牛农场)(红牛农场)类,该类
3、中有一个名字为类,该类中有一个名字为RedCow(红牛)的内部类(红牛)的内部类第六章 内部类与异常类浙江师范大学软件工程专业例1public class RedCowForm static String formName; RedCow cow; /内部类声明对象 RedCowForm() RedCowForm(String s) cow = new RedCow(150,112,5000); formName = s; public void showCowMess() cow.speak(); 第六章 内部类与异常类浙江师范大学软件工程专业例1class RedCow /内部类的声明 S
4、tring cowName = 红牛; int height,weight,price; RedCow(int h,int w,int p) height = h; weight = w; price = p; void speak() System.out.println(偶是+cowName+,身高:+height+cm 体重:+weight+kg,生活在+formName); /内部类结束 第六章 内部类与异常类浙江师范大学软件工程专业例1public class Example7_1 public static void main(String args) RedCowForm for
5、m = new RedCowForm(红牛农场); form.showCowMess(); form.cow.speak(); /RedCowForm.RedCow redCow = new RedCowForm.RedCow(180,119,6000); /redCow.speak(); 第六章 内部类与异常类浙江师范大学软件工程专业成员内部类class Outer class Inner编译上述代码会产生两个文件:Outer.class和Outer$Inner.class。第六章 内部类与异常类浙江师范大学软件工程专业方法内部类把类放在方法内class Outer public void
6、doSomething() class Inner public void seeOuter() (1) 方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。(2) 方法内部类对象不能使用该内部类所在方法的非final局部变量。第六章 内部类与异常类浙江师范大学软件工程专业静态嵌套类 static class RedCow /内部类的声明 static String cowName = 红牛; static int height,weight,price; RedCow(int h,int w,int p) height = h; weight = w; price = p
7、; static void speak() System.out.println(偶是+cowName+,身高:+height+cm 体重:+weight+kg,生活在+formName); /内部类结束第六章 内部类与异常类浙江师范大学软件工程专业静态内部类静态内部类中可以定义静态或者非静态的成员。从技术上讲,静态嵌套类不属于内部类。因为内部类与外部类共享一种特殊关系,更确切地说是对实例的共享关系。而静态嵌套类则没有上述关系。它只是位置在另一个类的内部,因此也被称为顶级嵌套类。静态的含义是该内部类可以像其他静态成员一样,没有外部类对象时,也能够访问它。静态嵌套类仅能访问外部类的静态成员和方法
8、。第六章 内部类与异常类浙江师范大学软件工程专业7.2 匿名类匿名类: :和子类有关的匿名类和子类有关的匿名类 JavaJava允许我们直接使用一个类的子类的允许我们直接使用一个类的子类的类体创建类体创建一个子类对象。一个子类对象。 创建子类对象时,除了使用父类的构造方法外还创建子类对象时,除了使用父类的构造方法外还有类体,此类体被认为是一个子类去掉类声明后的类有类体,此类体被认为是一个子类去掉类声明后的类体,称作体,称作匿名类匿名类。 假设假设BankBank是是类类,那么下列代码就是用,那么下列代码就是用Bank的一个的一个子类子类(匿名类)(匿名类)创建对象:创建对象: new new
9、Bank() () 匿名类的类体匿名类的类体 ; ; 第六章 内部类与异常类浙江师范大学软件工程专业匿名(子)类特点匿名类可继承父类的方法也可重写父类的方法;使用匿名类时,必须是在某个类中直接用匿名类创建对象,因此匿名类一定是内部类;匿名类可访问外嵌类中的成员变量和方法,匿名类的类体中不可以声明static成员变量和static方法匿名类是一子类,无类名,所以用匿名类创建对象时,要直接使用父类的构造方法。第六章 内部类与异常类浙江师范大学软件工程专业例2 例子2中(Example7_2.java)的ShowBoard类类的showMess(OutputAlphabet show)方法的参数是O
10、utputAlphabet类型的对象,用户在编写程序时,希望使用ShowBoard类的对象调用showMess(InputAlphabet show)输出英文字母表和希腊字母表,但系统没有提供输出希腊字母表的子类(只提供了输出英文字母表的子类OutputEnglish.java ),因此用户在主类的main方法中,向showMess方法的参数传递了一个匿名类的对象,该匿名类的对象对象负责输出希腊字母表。第六章 内部类与异常类浙江师范大学软件工程专业例2abstract class OutputAlphabet public abstract void output();public class
11、 OutputEnglish extends OutputAlphabet public void output() for(char c=a;c=z;c+) System.out.printf(%3c,c); 第六章 内部类与异常类浙江师范大学软件工程专业例2public class ShowBoard void showMess(OutputAlphabet show) show.output(); public class Example7_2 public static void main(String args) ShowBoard board=new ShowBoard(); bo
12、ard.showMess(new OutputEnglish(); /向参数传递OutputAlphabet的子类对象 board.showMess(new OutputAlphabet() /向参数传递OutputAlphabet的匿名子类对象 public void output() for(char c=;c=;c+) /输出希腊字母 System.out.printf(%3c,c); ); 第六章 内部类与异常类浙江师范大学软件工程专业 假设假设Computable是一个接口,那么,是一个接口,那么,Java允许直接用接口名和一个类体创建一个匿名对象,允许直接用接口名和一个类体创建一个
13、匿名对象,此类体被认为是实现了此类体被认为是实现了Computable接口的类去接口的类去掉类声明后的类体,称作匿名类。掉类声明后的类体,称作匿名类。 下列代码就是用实现了下列代码就是用实现了Computable接口的接口的类(匿名类)创建对象:类(匿名类)创建对象: new Computable() 实现接口的匿名类的类体实现接口的匿名类的类体 例例3 3 7.2.2 和接口有关的匿名类和接口有关的匿名类第六章 内部类与异常类浙江师范大学软件工程专业例3interface SpeakHello void speak();class HelloMachine public void turnO
14、n(SpeakHello hello) hello.speak(); public class Example7_3 public static void main(String args) HelloMachine machine = new HelloMachine(); machine.turnOn( new SpeakHello() public void speak() System.out.println(hello,you are welcome!); ); machine.turnOn( new SpeakHello() public void speak() System.o
15、ut.println(你好,欢迎光临你好,欢迎光临!); ); 第六章 内部类与异常类浙江师范大学软件工程专业 7.3 异常类异常类第六章 内部类与异常类浙江师范大学软件工程专业exceptionexception分成两大类Error:指那些致命性的意外情况,例如JVM的内部错误,通常程序员无能为力处理。Exception:那些可能在应用程序中检测到,并得到适当处理的意外情况,称为“异常”。RuntimeExceptionchecked exceptions第六章 内部类与异常类浙江师范大学软件工程专业exception:对象Java决定用对象来表达所有的意外情况,显然是“一段异常信息”和“一
16、个返回码”的普化。将意外情况分为Error和Exception两个子类,它们的共同父类为Throwable (含一String)用户自定义的意外情况也都必须是Throwable,即它的直接或间接子类。(习惯上, 人们常让它们直接extends Exception)这样的”异常“也就不一定非是对应某种现实的意外情况,可以是“虚拟的”(尽管最好不用)。第六章 内部类与异常类浙江师范大学软件工程专业Java使用使用trycatch语句来处理异常,将可语句来处理异常,将可能出现的异常操作放在能出现的异常操作放在trycatch语句的语句的try部分,部分,将发生异常后的处理放在将发生异常后的处理放在c
17、atch部分。部分。 trycatch语句的格式如下:语句的格式如下: try 包含可能发生异常的语句包含可能发生异常的语句 catch(ExceptionSubClass1 e) catch(ExceptionSubClass2 e) 例例4 47.3.1 trytrycatchcatch语句语句第六章 内部类与异常类浙江师范大学软件工程专业public class Example7_4 public static void main(String args ) int n=0,m=0,t=1000; try m=Integer.parseInt(8888); n=Integer.parse
18、Int(ab85); /发生异常,转向catch t=7777; /t没有机会赋值 catch(NumberFormatException e) System.out.println(发生异常:+e.getMessage(); n=123; System.out.println(n=+n+,m=+m+,t=+t); 第六章 内部类与异常类浙江师范大学软件工程专业我们也可以扩展我们也可以扩展ExceptionException类定义自己的异类定义自己的异常类,然后规定哪些方法产生这样的异常。常类,然后规定哪些方法产生这样的异常。一个方法在声明时可以使用一个方法在声明时可以使用throwsthro
19、ws关键字关键字声声明要产生的若干个异常,并在该方法的方法体中明要产生的若干个异常,并在该方法的方法体中具体给出产生异常的操作,即用相应的异常类创具体给出产生异常的操作,即用相应的异常类创建对象,并使用建对象,并使用throwthrow关键字抛出该异常对象,关键字抛出该异常对象,导致该方法结束执行。导致该方法结束执行。 例例5 57.3.2 自定义异常类自定义异常类第六章 内部类与异常类浙江师范大学软件工程专业BankException.javapublic class BankException extends Exception String message; public BankExc
20、eption(int m,int n) message=入账资金+m+是负数或支出+n+是正数,不符合系统要求.; public String warnMess() return message; 第六章 内部类与异常类浙江师范大学软件工程专业Bank.javapublic class Bank private int money; public void income(int in,int out) throws BankException if(in=0|in+out0:负数不能是成绩; sum=sum+number; System.out.println(总成绩:+sum); 第六章 内
21、部类与异常类浙江师范大学软件工程专业7.5 应用举例应用举例带finally子语句的trycatch语句,语法格式如下: try catch(ExceptionSubClass e) finally其执行机制是在执行trycatch语句后,执行finally子语句,也就是说,无论在try部分是否发生过异常,finally子语句都会被执行。例子7(DangerException.java , CargoBoat.java , Example7_7.java )中模拟向货船上装载集装箱,如果货船超重,那么货船认为这是一个异常,将拒绝装载集装箱,但无论是否发生异常,货船都需要正点启航。运行效果如图7
22、.8。第六章 内部类与异常类浙江师范大学软件工程专业DangerException.javapublic class DangerException extends Exception final String message = 超重; public String warnMess() return message; 第六章 内部类与异常类浙江师范大学软件工程专业CargoBoat.javapublic class CargoBoat int realContent; /装载的重量 int maxContent; /最大装载量 public void setMaxContent(int c)
23、 maxContent = c; public void loading(int m) throws DangerException realContent += m; if(realContentmaxContent) throw new DangerException(); System.out.println(目前装载了+realContent+吨货物); 第六章 内部类与异常类浙江师范大学软件工程专业Example7_7.javapublic class Example7_7 public static void main(String args) CargoBoat ship = new CargoBoat(); ship.setMaxContent(1000); int m =600; try ship.loading(m); m = 400; ship.loadin
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 产品质量检验手册
- 建筑门窗施工图设计合同模板
- 外交学院班主任合同书
- 口腔正畸诊所医师劳动合同
- 城市公园足球场施工合同
- 绿色交通种树施工合同范文
- 2024年工程分包合作合同
- 2024年建筑公司股权变更框架协议
- 自行车维修腻子粉施工协议
- 办公文具租赁合同模板
- 学会宽容善待他人
- 算法及其描述-高中信息技术粤教版(2019)必修1
- RITTAL威图空调中文说明书
- 生物质能发电技术应用中存在的问题及优化方案
- GA 1809-2022城市供水系统反恐怖防范要求
- 幼儿园绘本故事:《老虎拔牙》 课件
- 2021年上半年《系统集成项目管理工程师》真题
- GB/T 706-2008热轧型钢
- 实验六 双子叶植物茎的初生结构和单子叶植物茎的结构
- GB/T 25032-2010生活垃圾焚烧炉渣集料
- GB/T 13610-2020天然气的组成分析气相色谱法
评论
0/150
提交评论