黑马程序员_day011_内部类和异常

----------- 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 内部类对象;

私有:是不可以直接在外部访问。 

2static修饰符。 

内部类被静态修饰,出现访问局限性,只能访问外部类中的静态成员。 

内部类被静态后,会随着外部类的加载而加载。

如果内部类中定义了静态成员,该内部类必须被静态修饰。 

//访问静态内部类中的非静态成员。 直接创建内部类对象。 

外部类名.内部类名 变量名 = 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学习型技术博客、期待与您交流! ------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值