内部类:
特点:
1.内部类可以直接访问外部类中的成员,包括私有。之所以可以直接访问外部类中的成员,是因为外部类中持有了一个外部类的引用,格式是Outer.this
2.外部类要访问内部类,要建立内部类对象
访问方式:
1.外部访问内部类的方法:Outer.Inner in = new Outer().new Inner();当内部类定义在外部类的成员位置上,而且非私有
2.内部类访问外部类变量:Outer.this
3.当内部类在成员位置上,可以被成员修饰符所修饰:
比如,private 将内部类在外部类中进行封装;
static 内部类就具备静态特性,当内部类被static修饰后,只能直接方而你外部类中的static成员,出现了访问局限
注意:1.当内部类中定义了静态成员,该内部类必须是静态的;当外部类中的静态方法访问内部类时,内部类也必须是static
2.内部类定义在局部时,不可以被成员修饰符修饰,可以直接访问外部类中的成员,因为还有外部类的引用,但是不可以访问他所在的局部中的变量,只能被final修饰的局部变量
内部类定义原则:
当描述事物时,事物的内部还有事物,该事物用内部类描述。因为内部事物在使用外部事务的内容。
匿名内部类:
1.匿名内部类其实就是内部类的简写格式 2.定义匿名内部类的前提:内部类必须是继承一个类或者实现接口
异常
1.异常由来:问题也是现实生活中的一个具体的事物,也可以通过java的类的形式进行描述,并封装成对象。其实就是java对不正常情况进行描述后的对象体现
问题分成两种,一种是严重的问题,一种是非严重的问题;java中对于严重问题通过Error进行描述,一般不编写针对性的代码进行处理;对于非严重的,通过Exception类进行描述,对与Exception可以使用针对性的处理方式进行处理。
2.异常机制:
Throwable
|--Error
|--Exception
3.异常处理:
try{ 需要被检测的代码 }
catch(异常类 变量){ 处理异常的代码:处理方式 }
finally{ 一定会执行的语句 }
4.异常的好处:
(1)将问题进行封装 (2)将正常流程代码和问题进行处理代码想分离,方便阅读
5.异常的处理原则:
(1)方式有两种:try或者throws
(2)调用到抛出异常功能时,抛出几个,就处理几个,一个try对应多个catch
(3)多个catch,父类的catch放到最下面
(4)catch内,需要对伊针对性的处理方式,不要简单的定义printStackTrace输出语句,也不要不写;当捕获到异常,本功能处理不了时,可以继续在catch中抛出
对多异常的处理
(1)声明异常时,建议声明更为具体的异常,这样处理的可以更具体
(2)对方声明几个异常,就对应有几个catch块,不要定义多余的catch块。如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面
注意:
(1)在内层函数上抛出的异常,必须在外层进行处理(要么继续抛,要么编写代码处理)(RuntimeException除外),如果都不处理,最后会抛给jvm
(2)在进行catch处理是,catch块中一定要定义具体的处理方式,不要简单定义一句e.printStackTrace(),也不要简单的书写一句输出语句
自定义异常
因为项目中回出现特有的问题,而这些问题并未被java所描述并封装对象,所以对于这些特有的问题可以按照java的对问题封装的思想,将特有的问题惊醒自定义的异常封装。
throws和throw区别
throws使用在函数上,后面跟的是异常类,可以跟多个,用逗号隔开
throw使用在函数内, 后面跟的是异常对象 throw new 类名()
特殊异常类:RuntimeException
Exception中的一个特殊的子类异常,RuntimeException运行时异常。
如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过;如果在函数上声明了该异常,调用者可以不用进行处理,编译一样通过。
之所以不用声明,是因为不需要调用者处理,当该异常发生时,希望程序停止,因为运行是,出现了无法继续运算的情况,希望程序停止后,对代码
进行修正
异常的种类:
(1)编译时被检测的异常:编译时期检测到有可处理而未被处理的异常
(2)编译时不被检测的异常(运行时异常,RuntimeException及子类):出现后会直接导致程序停止的异常。建议不处理,让程序停止,需要修正代码。
finally:
finally中存放的是一定会被执行的的代码,通常是用来关闭资源
有一种情况不被读到:System.exit(0);系统退出,jvm停止运行。
异常在子父类覆盖中的体现:
(1)子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法只能抛出父类的异常或者该异常的子类
(2)如果父类方法抛出多个异常,那么子类在覆盖该方法是,只能抛出父类异常的子集
(3)如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。如果子类方法发生异常就必须进行try处理,绝对不能抛。