----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
一、内部类
特点:
内部类可以直接访问外部类中的成员。
外部类要访问内部类中的成员必须创建内部类的对象。
为什么内部类可以直接访问外部类中的成员呢?
因为内部类都持有一个外部类的引用。 外部类名.this
class Outer{
int num=2;
class Inner{
int num=4;
public void show(){
System.out.println(Outer.this.num);结果为2
}
}
}
二、内部类的修饰符
当内部类定义在外部类的成员位置上时,
可以使用成员的修饰符来进行内部类的修饰,
1,权限修饰符。
默认或者公有
可以直接这样访问内部类。
外部类名.内部类名 变量名 = new 外部类对象.new 内部类对象;
私有:是不可以直接在外部访问。
2,static修饰符。
内部类被静态修饰,出现访问局限性,只能访问外部类中的静态成员。
内部类被静态后,会随着外部类的加载而加载。
如果内部类中定义了静态成员,该内部类必须被静态修饰。
//访问静态内部类中的非静态成员。 直接创建内部类对象。
外部类名.内部类名 变量名 = new 外部类名.内部类名();
//访问静态内部类中的静态成员。 不需要对象。
外部类名.内部类名.内部类的静态成员
记住:内部类只有定义在外部类的成员 位置上,才具备这些修饰符。
三、内部类也可以定义在外部类中的局部位置上。
内部类定义在局部位置上,不允许访问局部中变量。因为局部中的变量生命周期短,随着所作用函数的释放而释放,而内部类再进行调用时就会出现异常。所以在局部位置的内部类只能访问被final修饰的局部常量。
五、匿名内部类。
凡是匿名都是简写格式。
要定义匿名内部类,必须要前提。
前提:内部类需要继承或者实现一个外部的类或者接口。
这时才能简写成匿名内部类的形式。
匿名内部类其实就是一个匿名子类对象。这个对象用{}结尾内部定义了成员。也就是说是一个带有成员内容的对象
格式:new 父类名或接口名().{成员内容}。
匿名内部类的局限性:
class Inner implements Inter内部类Inner实现接口Inter
class Outer{
Inter in = class Inner{
--------
};注意这儿有分号
in.show();此时的in是父类Inter的引用,对内部类对象进行了提升。所以内部类的局限性也正在于此,不能调用内部类中特有的方法。只能使用父类Inter中的方法。
}
还有一种调用方式,这种方式可以调用内部类中的特有方法。但是只能调用一个方法。
Class Outer{
new Inter(){
内部类特有方法show()
}.show();
}
new obj(){
非obj类中方法show()
}.show();是正确的。原理同上。
六、异常
异常的由来:程序运行时总会一些不正常的情况。
java语言对这些不正常情况也进行了描述。
并对这些不正常进行了对象的封装。
是描述不正常情况的对象。
通过查阅api。异常体系
Throwable:可抛出。
|--Error:严重的问题。一般都是由jvm从底层抛出来的问题。通常不需要处理。直接修改程序即可
|--Exception:是可以定义针对性的处理方式对该种情况进行处理。
不正常情况分两种,一种是可以解决的Exception,一种是严重性的Error。
无论是Error还是Exception,它们的子类都一个特点:子类名的后缀都是父类名。
这个异常体系最大的特点:就在于该体系中的类和对象都具备可抛性。
可抛性的体现就是无论是类,还是对象都可以被throws或者throw所操作。
throws操作类。throw操作对象。
七、异常的处理。
处理方式:
1,声明抛出。告诉调用者功能会有问题。通过throws关键字对问题声明在功能上。
2,进行捕捉。可以使用针对性的捕捉代码块完成。
try
{
//需要被检测的代码;
}
catch(异常类 变量)//该变量用于接收try检测到的异常对象。
{
//异常处理代码。
}
finally
{
//一定会被执行的代码。
}
八、throws throw关键字有什么区别?
throws用在函数上,用于功能声明异常,后面抛出的是异常类可以抛出多个,只要用逗号隔开即可。
throw 只能用在函数内,用于抛出异常对象,额外特点,一旦执行,就可以结束功能。
九、异常的重头戏
细节:
1,定义功能,功能内部因为传入的参数问题,导致了
功能会出现问题。这时为了解决这个问题,通常,我们
都会将问题通过throws声明在函数上。
目的:为了调用者在使用这个功能的时候,能明确
处理方式。也就是说throws抛出的目的是为了让调用者
预先定义好问题的处理方式。
2,如果一个功能抛出多个异常。
那么在调用该功能时,需要有多个catch进行每一个异常的针对性处理。
如果多个catch中有父类异常,一定要定义在最下面。否则编译失败。
3,特殊部分:
函数内throw抛出异常对象,函数上一定要用throws声明。否则编译失败。
调用到声明异常的函数,要进行throws声明抛出,或者trycatch捕捉,否则,编译失败。
注意:异常分两种。
1,编译时被编译器检测的异常。
通常都需要编写针对性的处理代码进行处理。
2,编译时不被检测的异常。这种异常出现,编译时期是不在检查之列。这种异常称为运行时异常。
也就说函数内throw抛出运行时异常,不需要在函数上声明。即使声明了,调用者也不用一定给出预先处理方式。 因为它不会导致编译失败。
通常,不编写针对性的代码进行处理。一旦发生,就让程序停掉。
为了对代码进行修正。
区分方式:
Exception中一个特殊的子类:RuntimeException就是运行时异常。
RuntimeException和其子类都不需要编译时检测。
意味着:我们在自定义异常时,可以继承Exception,称为编译时被检测的异常。
也可以继承RuntimeException,称为运行时异常。
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------