接口与内部类

                         [8]接口与内部类

一.接口

1.什么是接口

  • 接口是一种特殊的抽象类, 所有方法都是抽象的.

* 2.接口和抽象类的区别

  • 抽象类用abstract class定义, 接口用interface定义

  • 抽象类中可以有不抽象的方法, 接口中的方法全都是抽象的

  • 抽象类使用extends继承, 接口使用implements实现

  • 抽象类中的方法没有默认修饰符, 接口中的方法默认都是abstract public修饰的

  • 抽象类中的成员变量没有默认修饰符, 接口中的成员变量默认被public static final修饰

  • 一个类只能继承一个抽象类, 一个类可以实现多个接口

* 3.什么时候用抽象类, 什么时候用接口:

  • 如果一个类所有方法都是抽象的, 那么就用接口.

  • 如果一个类中抽象方法和不抽象的方法全都需要, 那么就定义为抽象类.

4.什么情况下一个类不能同时实现2个接口

  • 两个接口中有方法名, 参数列表相同, 但是返回值类型不同的方法.

5.什么情况下会把子类类型强转为父类类型

  • 当一个子类对象可以匹配多个重载的方法, 而多个方法中的形参是这个子类实现的不同的父类类型.

  • 这时调用不明确, 因为子类对象可以传入多个方法, 需要强转为父类类型, 才能明确调用哪个方法.


二.内部类

1.什么是内部类

  • 在类中定义的类就是内部类

2.类中的内部类

  • a.什么是类中的内部类

  • 在一个类中定义另外一个类, 内部类是外部类的一个成员.

  • 在创建内部类对象时, 必须先创建外部类对象. 然后通过外部类对象才能创建内部类对象. 

  • 创建对象的语法: 外部类名.内部类名 变量名 = new 外部类().new 内部类();

  • 一个外部类对象可以有多个内部类对象, 一个内部类对象只能有一个外部类对象

  • b.什么时候使用类中的内部类

  • 当一个类需要访问另一个类的成员时.

  • 当创建一个类需要先创建另一个类的对象时.

  • c.内部类访问外部类成员

  • 可以使用"外部类名.this.成员名"形式访问外部类对象的成员. 

  • 在方法中使用this, this代表调用当前方法的对象. "外部类名.this"代表调用当前方法的对象的外部类对象

  • 外部类不能访问内部类的成员

  • d.内部类中不能定义静态成员

  • static的本意就是不创建对象就能直接使用,内部类的本意是必须创建外部类对象才能使用, 互相矛盾

3.方法中的内部类

  • a.什么是方法中的内部类

  • 内部类定义在方法中, 只能在当前方法中使用

  • b.方法中的内部类和类中的内部类的区别

  • 只能在当前方法中使用, 定义类的代码必须在使用类之前

  • c.方法中的内部类怎么创建对象

  • 在方法中直接使用 new 类名()

  • d.什么时候用方法中的内部类

  • 如果一个类只在某个方法中使用的时候

  • e.方法中的内部类怎么访问方法中的局部变量

  • 这个局部变量必须是final的

* 4.匿名内部类

  • a.什么是匿名内部类

  • 匿名内部类也是方法中内部类的一种, 一个没有名字的内部类

  • new 父类名() { 类定义 }

  • b.什么时候使用匿名内部类

  • 如果一个类只使用一次, 那么就可以定义为匿名内部类

  • c.匿名内部类的class文件名

  • 外部类名$编号.class

5.静态内部类

  • a.什么是静态内部类

  • 用static关键字修饰的内部类, 可以不创建外部类对象直接使用, 可以定义静态成员

  • b.静态内部类和普通的类中内部类的区别

  • 创建对象: 外部类名.内部类名 变量名 = new 外部类名.内部类名();

  • 访问外部成员: 不能访问外部非静态成员

  • 定义静态成员: 可以定义静态成员


三.异常

1.什么是异常

  • 异常就是程序运行过程中出现的一些错误, 使用throw关键字抛出的一些对象. 

  • 可以通知调用处, 调用处下面的代码不会再执行了.

2.异常的处理方式

  • a.声明

  • 在参数列表之后, 使用throws关键字声明要抛出的异常, 这样做在方法中出现了异常的时候, 该方法会将此异常继续抛出给调用者

  • 异常一旦抛出, 下面的代码不再执行

  • b.捕捉

  • 将有可能出现异常的代码放在try代码块中, 使用catch关键字捕捉指定的异常, 当try代码出现这个异常的时候, 就会执行catch中的代码

  • 异常如果被捕获, try...catch代码块外面的代码可以继续执行

3.异常的分类

  • a.编译时异常

  • Exception中除了RuntimeException的部分, 编译之前在代码中必须对其进行声明或捕捉, 否则编译报错

  • b.运行时异常

  • RuntimeException或其子类, 在代码中可以不对其进行处理, 编译不报错.

  • 这类异常经常会出现, 例如数组索引越界, 空指针, 算数异常, 如果对其进行处理, 非常麻烦, 代码可读性也会下降.

4.多个异常的处理方式

  • a.声明

  • throws后面可以声明多个异常, 用","分割

  • b.捕捉

  • try代码块后面可以跟多个catch, 每个catch中指定要捕获的异常

  • 如果要捕获的异常有子类和父类的关系, 子类要写在父类的上面

5.子类重写父类方法时注意的异常问题

  • 子类不能比父类抛出更多的异常, 子类抛出的异常范围要更小, 是父类异常的一个子集

  • 如果父类没有抛出任何异常, 那么子类中的异常只能捕获

6.finally的使用

  • finally是配合try使用的, 只要执行了try中的额代码, finally中的代码就一定会执行.

  • finally和finalize和final有什么区别?

  • finally是必须执行的代码

  • finalize是Object类中的一个方法, 这个方法默认在对象被销毁之前执行

  • final是最终的, 可以用来修饰类, 方法, 变量 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章