




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、JavaJava支持在一个类中声明另一个类,这样的类称作支持在一个类中声明另一个类,这样的类称作内部类,而包含内部类的类称为内部类的外嵌类。内部类,而包含内部类的类称为内部类的外嵌类。内部类的外嵌类的成员变量在内部类中依然有效,内部类的外嵌类的成员变量在内部类中依然有效,内部类中的方法也可以调用外嵌类中的方法。内部类中的方法也可以调用外嵌类中的方法。内部类的类体中不可以声明类变量和类方法。外嵌内部类的类体中不可以声明类变量和类方法。外嵌类的类体中可以用内部类声明对象,作为外嵌类的类的类体中可以用内部类声明对象,作为外嵌类的成员。成员。内部类仅供它的外嵌类运用,其他类不可以用某个内部类仅供它的外
2、嵌类运用,其他类不可以用某个类的内部类声明对象。类的内部类声明对象。另外,由于内部类的外嵌类的成员变量在内部类中另外,由于内部类的外嵌类的成员变量在内部类中依然有效,使得内部类和外嵌类的交互更加方便。依然有效,使得内部类和外嵌类的交互更加方便。例例8-18-1public class RedCowForm public class RedCowForm String formName; String formName; RedCow cow; / RedCow cow; /内部类声明对象内部类声明对象 RedCowForm() RedCowForm() RedCowForm(String s)
3、 RedCowForm(String s) cow = new RedCow(150,112,5000); cow = new RedCow(150,112,5000); formName=s; formName=s; public void showCowMess() public void showCowMess() cow.speak(); cow.speak(); class RedCow / class RedCow /内部类的声明内部类的声明 String cowName= String cowName=红牛红牛; ; int height,weight,price; int he
4、ight,weight,price; RedCow(int h,int w,int p) RedCow(int h,int w,int p) height=h; height=h; weight=w; weight=w; price=p; price=p; void speak() void speak() System.out.println( System.out.println(偶是偶是+cowName+,+cowName+,身高身高:+height+:+height+cm cm 体重体重:+weight+kg,:+weight+kg,生活在生活在+formName);+formName
5、); public class Example8_1 public class Example8_1 public static void main(String args) public static void main(String args) RedCowForm form = new RedCowForm( RedCowForm form = new RedCowForm(红牛红牛农场农场);); form.showCowMess(); form.showCowMess(); 8.2.1 8.2.1 和子类有关的匿名类和子类有关的匿名类创建子类对象时,除了运用父类的构造方法外还有创建子
6、类对象时,除了运用父类的构造方法外还有类体,此类体被以为是一个子类去掉类声明后的类类体,此类体被以为是一个子类去掉类声明后的类体,称作匿名类。体,称作匿名类。匿名类就是一个子类,由于无名可用,所以不能够匿名类就是一个子类,由于无名可用,所以不能够用匿名类声明对象,但却可以直接用匿名类创建一用匿名类声明对象,但却可以直接用匿名类创建一个对象。个对象。匿名类例子匿名类例子new Bank( )new Bank( ) 匿名类类体匿名类类体 ;假设假设BankBank是类,那么上面代码就是用是类,那么上面代码就是用BankBank的一个的一个子类匿名类创建的对象。子类匿名类创建的对象。由于匿名类是一个
7、子类,但没有类名,所以在用匿名由于匿名类是一个子类,但没有类名,所以在用匿名类创建对象时,要直接运用父类的构造方法。类创建对象时,要直接运用父类的构造方法。虽然匿名类创建的对象没有经过类声明步骤,但匿名虽然匿名类创建的对象没有经过类声明步骤,但匿名对象的援用可以传送给一个匹配的参数,匿名类的常对象的援用可以传送给一个匹配的参数,匿名类的常用的方式是向方法的参数传值。用的方式是向方法的参数传值。匿名类可以承继父类的方法也可以重写父类的方法。匿名类可以承继父类的方法也可以重写父类的方法。运用匿名类时,必然是在某个类中直接用匿名类创建运用匿名类时,必然是在某个类中直接用匿名类创建对象,因此匿名类一定
8、是内部类,匿名类可以访问外对象,因此匿名类一定是内部类,匿名类可以访问外嵌类中的成员变量和方法,匿名类的类体中不可以声嵌类中的成员变量和方法,匿名类的类体中不可以声明明staticstatic成员变量和成员变量和staticstatic方法方法例例8-28-2ShowBoardShowBoard类的类的showMess(InputAlphabet show)showMess(InputAlphabet show)方法方法的参数是的参数是InputAlphabetInputAlphabet类型的对象,用户在编写程序类型的对象,用户在编写程序时,希望运用时,希望运用ShowBoardShowBoa
9、rd类的对象调用类的对象调用showMess(InputAlphabet show)showMess(InputAlphabet show)输出英文字母表和希输出英文字母表和希腊字母表,但系统没有提供输出希腊字母表的子类,腊字母表,但系统没有提供输出希腊字母表的子类,因此用户可以运用匿名类来实现因此用户可以运用匿名类来实现abstract class InputAlphabet abstract class InputAlphabet public abstract void input(); public abstract void input(); public class InputEn
10、glish extends InputAlphabet public class InputEnglish extends InputAlphabet public void input() public void input() for(char c=a;c=z;c+) for(char c=a;c=z;c+) System.out.printf(%3c,c); System.out.printf(%3c,c); public class ShowBoard public class ShowBoard void showMess(InputAlphabet show) void showM
11、ess(InputAlphabet show) show.input(); show.input(); public class Example8_2 public class Example8_2 public static void main(String args) public static void main(String args) ShowBoard board=new ShowBoard(); ShowBoard board=new ShowBoard(); board.showMess(new InputEnglish(); / board.showMess(new Inpu
12、tEnglish(); /向参数传送向参数传送InputAlphabetInputAlphabet的子类对象的子类对象 board.showMess(new InputAlphabet() / board.showMess(new InputAlphabet() /向参数传送向参数传送InputAlphabetInputAlphabet的匿名子类对象的匿名子类对象 public void input() public void input() for(char c=;c=;c+) / for(char c=;c=;c+) /输出希腊字输出希腊字母母 System.out.printf(%3c,
13、c); System.out.printf(%3c,c); ); ); 假设假设ComputableComputable是一个接口,那么,是一个接口,那么,JavaJava允许直接用接允许直接用接口名和一个类体创建一个匿名对象,此类体被以为是实口名和一个类体创建一个匿名对象,此类体被以为是实现了现了ComputableComputable接口的类去掉类声明后的类体,称作匿接口的类去掉类声明后的类体,称作匿名类。以下代码就是用实现了名类。以下代码就是用实现了ComputableComputable接口的类匿接口的类匿名类创建对象:名类创建对象:new Computable() new Compu
14、table() 实现接口的匿名类的类体实现接口的匿名类的类体;假设某个方法的参数是接口类型,那么可以运用接口名假设某个方法的参数是接口类型,那么可以运用接口名和类体组合创建一个匿名对象传送给方法的参数,类体和类体组合创建一个匿名对象传送给方法的参数,类体必需求重写接口中的全部方法必需求重写接口中的全部方法例例8-38-3interface SpeakHello interface SpeakHello void speak(); void speak(); class HelloMachine class HelloMachine public void turnOn(SpeakHello h
15、ello) public void turnOn(SpeakHello hello) hello.speak(); hello.speak(); public class Example8_3 public class Example8_3 public static void main(String args) public static void main(String args) HelloMachine machine = new HelloMachine(); HelloMachine machine = new HelloMachine(); machine.turnOn( new
16、 SpeakHello() machine.turnOn( new SpeakHello() public void speak() public void speak() System.out.println(hello,you are welcome!); System.out.println(hello,you are welcome!); ); ); machine.turnOn( new SpeakHello() machine.turnOn( new SpeakHello() public void speak() public void speak() System.out.pr
17、intln( System.out.println(他好,欢迎光临他好,欢迎光临!);!); ); ); 所谓异常就是程序运转时能够出现一些错误所谓异常就是程序运转时能够出现一些错误JavaJava的异常出如今方法调用过程中,即在方法调用的异常出如今方法调用过程中,即在方法调用过程中抛出异常对象,终止当前方法的继续执行,过程中抛出异常对象,终止当前方法的继续执行,同时导致程序运转出现异常,并等待处置同时导致程序运转出现异常,并等待处置JavaJava中常见异常中常见异常RuntimeException:RuntimeException:一些特殊的异常,比如被一些特殊的异常,比如被0 0除,数除
18、,数组下标越界等,处置比较费事。而且对程序的可读性组下标越界等,处置比较费事。而且对程序的可读性以及运转效率影响很大,因此由系统自动检测并将它以及运转效率影响很大,因此由系统自动检测并将它们交给缺省的异常处置程序用户可不用对其处置们交给缺省的异常处置程序用户可不用对其处置ArithmeticExceptionArithmeticException:数学计算异常:数学计算异常ArrayStoreExceptionArrayStoreException:数组存储异常:数组存储异常NegativeArraySizeExceptionNegativeArraySizeException:负数组长度异常
19、:负数组长度异常ArrayOutOfBoundsExceptionArrayOutOfBoundsException:数组索引越界异常:数组索引越界异常NullPointExceptionNullPointException:空指针异常:空指针异常IOException(IOException(用户必需对其处置!用户必需对其处置!) )FileNotFoundExceptionFileNotFoundException:文件未找到异常:文件未找到异常EOFExceptionEOFException:读写文件尾异常:读写文件尾异常MalformedURLExceptionMalformedURL
20、Exception:URLURL格式错误异常格式错误异常SocketExceptionSocketException:SocketSocket异常异常JavaJava中处置异常中处置异常Java处置异常是用5个关键字实现的try catch finally throw throws 捕获异常捕获异常 catchtryfinally执行能够产生执行能够产生 异常的代码异常的代码 捕获异常捕获异常 无论能否发生异常,无论能否发生异常,代码总能执行代码总能执行手动抛出异常手动抛出异常 抛出异常抛出异常 throw声明异常声明异常 声明方法能够要声明方法能够要抛出的各种异常抛出的各种异常 throws
21、 异常处置方式异常处置方式两种处置方式:两种处置方式:1 1运用运用trycatchfinallytrycatchfinally构造对异构造对异常进展捕获和处置常进展捕获和处置2 2经过经过throwsthrows和和throwthrow抛出异常抛出异常trycatchfinallytrycatchfinally构造构造trytry/ / 能够会抛出特定异常的代码段能够会抛出特定异常的代码段catch(catch(异常类型异常类型1 1 援用援用1)1)/ / 假设援用假设援用1 1 被抛出,那么执行这段代码被抛出,那么执行这段代码catch(catch(异常类型异常类型2 2 援用援用2)2
22、)/假设另外的异常援用假设另外的异常援用2 2被抛出,那么执行这段代码被抛出,那么执行这段代码 finally finally/无条件执行的语句无条件执行的语句 各个各个catchcatch参数中的异常类都是参数中的异常类都是ExceptionException的某个子类,的某个子类,阐明阐明trytry部分能够发生的异常,这些子类之间不能有父子部分能够发生的异常,这些子类之间不能有父子关系,否那么保管一个含有父类参数的关系,否那么保管一个含有父类参数的catchcatch即可即可阐明阐明(1) try(1) try将能够出现异常的代码都放在将能够出现异常的代码都放在trytry代码代码块中块
23、中(2) catch- (2) catch- 假设假设trytry内出现了异常,系统将终止内出现了异常,系统将终止trytry块代码的执行,自动跳转到所发生的异常类块代码的执行,自动跳转到所发生的异常类对应的对应的catchcatch块中。执行该块中代码块中。执行该块中代码(3) finally(3) finally是可选项,无论异常能否发生,该是可选项,无论异常能否发生,该块都执行。普通用来善后处置块都执行。普通用来善后处置阐明阐明4 4 catchcatch与与finallyfinally不能同时省略不能同时省略5 5try.catchtry.catch以及以及finallyfinally
24、语句块之间不能插入语句块之间不能插入任何代码任何代码例例1 1:捕获数组下标越界异常:捕获数组下标越界异常public class Exception1 public static void main(String args ) try int a = 1, 2, 3, 4, 5 , sum = 0;for (int i = 0; i = 5; i+)sum = sum + ai;System.out.println(sum= + sum);System.out.println(Successfully! ); catch (ArrayIndexOutOfBoundsException e)
25、System.out.println(ArrayIndexOutOfBoundsException detected); finally System.out.println( Programm Finished! ); 例例2 2 :捕获算术异常:捕获算术异常public class Exception2 public class Exception2 public static void main(String args) public static void main(String args) try try int x, y;int x, y;x = 15;x = 15;y = 0;y
26、 = 0;System.out.println(x / y);System.out.println(x / y);System.out.println(Computing successfully!);System.out.println(Computing successfully!); catch (ArithmeticException e) catch (ArithmeticException e) System.out.println( ArithmeticException System.out.println( ArithmeticException catched catche
27、d !);); finally finally System.out.println(Finally block!);System.out.println(Finally block!); 异常的传播过程异常的传播过程假设没有假设没有catchcatch语句块捕获异常,异常将沿着方法语句块捕获异常,异常将沿着方法的调用栈不断向上传播。假设传播的过程不断没有的调用栈不断向上传播。假设传播的过程不断没有catchcatch语句块捕获,那么最终传播到语句块捕获,那么最终传播到mainmain方法,最方法,最后从后从mainmain方法抛出,有方法抛出,有JREJRE来处置来处置public clas
28、s Testpublic class Test public static void main(String args)public static void main(String args)/在主方法中调用在主方法中调用method1method1 method1(); method1(); static void method1()static void method1()/在在method1method1中调用中调用method2method2方法方法method2();method2(); static void method2()static void method2() int a
29、=new int3;int a=new int3;a4=12;/a4=12;/产生下标越界异常产生下标越界异常System.out.println(ok!);System.out.println(ok!); 异常的分类异常的分类异常可分为:可控异常和执行时异常异常可分为:可控异常和执行时异常可控异常:可控异常:即使程序本身没有问题,在某些情况下也能够发生即使程序本身没有问题,在某些情况下也能够发生比如:运用输入输出功能时,能够会由于硬件问题,使比如:运用输入输出功能时,能够会由于硬件问题,使得程序无法正常从硬件获得输入或输出,这种错误是可得程序无法正常从硬件获得输入或输出,这种错误是可以预期发
30、生的。像这类异常称之为可控异常以预期发生的。像这类异常称之为可控异常留意:留意:JavaJava规定:对于可控异常,编译器要求您必需进规定:对于可控异常,编译器要求您必需进展处置!展处置!补补充充例例题题import java.io.import java.io.* *; ;public class Testpublic class Testpublic static void main(String args)public static void main(String args) trytry BufferedReader buf=new BufferedReader buf=new Bu
31、fferedReader(new InputStreamReader(System.in);BufferedReader(new InputStreamReader(System.in);System.out.println(System.out.println(请输入整数请输入整数););int input=Integer.parseInt(buf.readLine();int input=Integer.parseInt(buf.readLine();System.out.println(input =+input);System.out.println(input =+input); c
32、atch(IOException e)catch(IOException e) System.out.println(I/O System.out.println(I/O异常异常);); catch(NumberFormatException e)catch(NumberFormatException e) System.out.println( System.out.println(输入必需为整数输入必需为整数);); 阐明阐明IOExceptionIOException是可控异常,是可预期会发生的异常。编是可控异常,是可预期会发生的异常。编译器要求您必需处置!译器要求您必需处置!留意:异常
33、一旦丢出就不会回到原点留意:异常一旦丢出就不会回到原点NumberFormatExceptionNumberFormatException是执行时异常。是执行时异常。所谓的执行时异常就是发生在程序执行期间,并不一定所谓的执行时异常就是发生在程序执行期间,并不一定可预测它的发生。且编译器不要求您一定要处置执行时可预测它的发生。且编译器不要求您一定要处置执行时异常。异常。对于执行时异常假设没有处置,那么异常会不断往外丢,对于执行时异常假设没有处置,那么异常会不断往外丢,最后由最后由JVMJVM来处置来处置抛出异常抛出异常1 1 抛出异常语句抛出异常语句2 2 抛出异常选项:抛出异常选项:throw
34、sthrows什么叫异常的抛出什么叫异常的抛出假设某个方法里面有异常,并且没有被捕获,那么其假设某个方法里面有异常,并且没有被捕获,那么其会一层一层上报给调用者。会一层一层上报给调用者。public class Testpublic class Test public static void main(String args)public static void main(String args) a(); a(); System.out.println( System.out.println(祝贺他,调用方法胜利!祝贺他,调用方法胜利!);); static void a()static v
35、oid a() trytry b();b(); catch(RuntimeException re)catch(RuntimeException re) System.out.println(System.out.println(异常在异常在a a方法被处理掉!方法被处理掉!);); static void b()static void b() c();c(); static void c()static void c() int a=new int3;int a=new int3;a4=12;a4=12; 小小例例题题1 1 抛出异常语句抛出异常语句程序员可以本人经过程序员可以本人经过thr
36、owthrow语句抛出异常。语句抛出异常。throwthrow语句的格式如下语句的格式如下: : throw new throw new 异常类名信息异常类名信息异常类名可以是系统异常类名,也可以是自定义的异异常类名可以是系统异常类名,也可以是自定义的异常类名常类名“信息是可选信息。假设提供了信息,信息是可选信息。假设提供了信息,toString()toString()方法的前往值中将添加该信息的内容方法的前往值中将添加该信息的内容例例3 3public class Exception3 public class Exception3 public static int Sum(int n)
37、public static int Sum(int n) if (n 0)if (n 0)throw new IllegalArgumentException(nthrow new IllegalArgumentException(n应该为正整数!应该为正整数!););int s = 0;int s = 0;for (int i = 0; i = n; i+)for (int i = 0; i = n; i+)s = s + i;s = s + i;return s;return s; public static void main(String args) public static voi
38、d main(String args) try try int n = Integer.parseInt(args0);int n = Integer.parseInt(args0);System.out.println(Sum(n);System.out.println(Sum(n); catch (ArrayIndexOutOfBoundsException e) catch (ArrayIndexOutOfBoundsException e) System.out.println(System.out.println(命令行为:命令行为: + java Exception3 + java
39、 Exception3 );); catch (NumberFormatException e2) catch (NumberFormatException e2) System.out.println(System.out.println(参数参数应为整数应为整数!);!); catch (IllegalArgumentException e3) catch (IllegalArgumentException e3) System.out.println(System.out.println(错误参数错误参数: + e3.toString();: + e3.toString(); final
40、ly finally System.out.println(System.out.println(程序终了程序终了!);!); 2 2 抛出异常选项抛出异常选项为了明确指出一个方法不捕获某类异常,而让调用该方为了明确指出一个方法不捕获某类异常,而让调用该方法的其他方法捕获该类异常,可以在声名方法的时候,法的其他方法捕获该类异常,可以在声名方法的时候,运用运用throwsthrows可选项,抛出该类异常。可选项,抛出该类异常。格式如下:格式如下: 修饰符修饰符 前往值类型名前往值类型名 方法名方法名 参数表参数表 throws throws 异常异常类型名类型名 方法体方法体 例例4 4抛出异常方法抛出异常方法public class Exception4 public class Exception4 public static int Sum() throws NegativeArraySizeException public static int Sum() throws NegativeArraySizeException int s = 0;int s = 0;int x = new int-4;int x = new int-4;for (int i = 0; i 4; i+) for (int i = 0; i 1.0E8 | aim1.0E8 | aim0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 交通事故损害赔偿及车辆维修服务合同
- 车辆抵押贷款信用评估与授信合同
- 电力设施运维及售后保障合同范本
- 餐饮企业厨师保密协议及知识产权保护合同
- 六年级个人工作总结(8篇)
- 小学二年级演讲稿(19篇)
- 武汉汉正街地区用地规划说明书
- 2025小班幼师健康教育计划(4篇)
- 营业员技能大赛复习测试卷附答案
- 气瓶练习试题及答案
- 应用电化学习题及答案
- 夜班管理中的质量控制和监督措施
- 110KV变压器检修施工方案
- 认知行为疗法(CBT)实操讲座
- 养老院行业现状分析-2023年中国养老院行业市场发展前景研究报告-智研咨询
- 电梯机房操作规程
- 餐饮业劳务合同
- 广联达BIM智慧工地
- 安全生产教育培训记录表
- 电梯参数及配置要求
- -高考体育单招真题现代文专项阅读汇编(含答案)-备战2023届高考体育单招语文一轮复习之现代文阅读复习之一
评论
0/150
提交评论