- 接口(interface)
- 内部类
- 局部内部类
- 匿名内部类(用的最频繁)
- 成员内部类
- 静态内部类
接口(特殊的抽象)就是给出一些没有实现的方法,封装到一起,到某个类到使用的时候,再根据具体情况把这些方法发写出来
-
语法:
interface 接口名{ //属性 //方法(1. 抽象方法 2.默认实现方法 3.静态方法) } class 类名 implements 接口{ 自己属性; 自己方法; 必须实现的接口的抽象方法 } -
如果一个类implements(实现)接口,需要将该接口的所有抽象方法都实现
-
接口不能被实例化,不能被使用
-
接口中所有的方法都是public方法,接口中抽象方法,可以不用abstract修饰
-
一个普通类实现接口,就必须将该接口的所有方法都实现
-
抽象类实现接口时,可以不用实现接口的方法
-
一个类可以同时实现多个接口
-
接口中的属性,只能是final,而且是public static final修饰符
- 比如 int a=1;实际上是 public static final int a=1;
-
接口中属性的访问形式:接口名.属性名
-
一个接口不能继承其他的类,但是可以继承多个别的接口
-
接口的修饰符只能是public和默认(和类的修饰符一样)
-
接口与继承
- 继承满足is-a关系,接口只需满足like-a关系
- 当子类继承了父类,就自动的拥有父类的功能
- 如果子类需要拓展功能,可以通过实现接口的方式拓展
- 可以理解实现接口是对java单继承机制的一种补充
-
接口在一定程度上实现代码解耦(即接口规范性+动态绑定)
类的五大成员
- 属性
- 方法
- 构造器
- 代码块
- 内部类
一个类的内部又完整的嵌套了另一个类结构,被嵌套的类称他为内部类,嵌套其他类的类称为外部类
-
最大特点:可以直接访问私有属性,并且可以体现类与类之间的包含关系
-
语法:
class Outer{//外部类 class Inner{//内部类 } } class Other{//外部其他类 } -
内部类的四种分类:
- 定义在外部类局部位置上(比如方法内)
- 局部内部类(有类名)
- 匿名内部类(没有类名)
- 定义在外部类的成员位置上(本质就是一个成员):
- 成员内部类(没有static修饰)
- 静态内部类(使用static修饰)
- 定义在外部类局部位置上(比如方法内)
局部内部类:是定义在外部类的局部位置,比如方法中,并且有类名
-
语法
final class Inner{//局部内部类 类体 } -
本质仍然是类
-
局部内部类可以直接访问外部类的所有成员,包含私有的
- 局部内部类访问外部类成员是直接访问
- 外部类访问局部内部类成员是:先创建对象,再访问(必须在作用域内)
- 外部其他类不能访问局部内部类,因为局部内部类的地位是一个局部变量
-
不能添加访问修饰符,因为他的地位就是一个局部变量,局部变量是不能使用修饰符的,但是可以使用final修饰,因为局部变量也可以使用final
-
作用域仅仅在定义它的方法或代码块中
-
局部内部类定义在方法/代码块中
-
作用域在方法体或者代码块中
-
如果外部类和局部内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问
匿名内部类:定义在外部类的局部位置,比如方法中,并且没有类名
-
语法
new 类或接口(参数列表){ 类体 }; -
本质仍然是类,内部类,且没有名字,同时还是一个对象
-
匿名内部类使用一次,就不能再使用,不过其对象(shower)可以反反复使用
-
基于接口的匿名内部类
-
基于类的匿名内部类
-
不能添加访问修饰符,因为他的地位是一个局部变量
-
作用域:仅仅在定义他的方法或者代码块中
-
匿名内部类既是一个类的定义,同时也是一个对象(之前有new)
- 可以最直接访问外部类的所有成员,包括私有的
- 匿名内部类访问外部类成员直接访问
- 外部其他类不能访问匿名内部类
-
如果外部类和局部内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问(与局部内部类有共同之处)
成员内部类时定义在外部类的成员位置,并且没有static修饰
-
语法:
访问修饰符 class Inner{//静态内部类 } -
可以直接访问外部类的所有成员,包含私有的
- 成员内部类访问外部类成员是直接访问
- 外部类访问成员内部类是先创建对象,再访问
- 外部其他类也可以访问成员内部类
-
可以添加任意访问修饰符(public、protected、默认、private),因为他的地位就是一个成员
-
如果外部类和局部内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问(与局部内部类有共同之处)
静态内部类:是定义在外部类的成员位置,并且有static修饰
-
语法
访问修饰符 static class 类{//静态内部类 类体 } -
可以直接访问外部类大的所有静态成员,包含私有的,但不能直接访问非静态成员
- 静态内部类访问外部类是直接访问
- 外部类访问静态内部类是先创建对象再访问
- 外部其他类也可以访问静态内部类
-
可以添加任意访问修饰符(public、protected、默认、private),因为他的地位就是一个成员
-
作用域:同其他的成员,为整个类体
-
如果外部类和局部内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.成员)去访问(因为其实静态的成员,因此不能像之前的内部类一样用this关键字)



