接口是一种标准
接口代表了某种能力,类似于生活中的合同
内部类
内部类定义在类的内部类的完整类
内部类编译后可以生成独立的字节码文件,内部类可以直接访问外部类的私有成员,不用破坏封装
可以为外部类提供必要的内部功能组件
接口
属性,接口的属性默认是静态常量,访问权限都是public
方法,接口中的方法,默认都是抽象方法,访问权限都是public
一般接口中不写成员变量只写方法,制定规则,所以又称为方法列表
接口让java从单继承实现了多继承扩充了功能,可以认为接口是类的补充
接口和抽象类的差别
相同点
都可以编译成字节码文件
都不能创建对象
都可以声明引用
都具备 Object 类中所定义的方法
都可以写抽象方法
不同点
接口中所有的属性,都是公开静态常量,缺省使用 public static fifinal 修饰。
接口中所有的方法,都是公开抽象方法,缺省使用 public abstract 修饰。
接口中没有构造方法、构造代码段、静态代码段。
接口的实现
接口的实现需要重写接口中的所有方法
一个类可以继承一个父类,可以实现多个接口
接口的继承
接口之间也是可以继承的,子接口可以继承到父接口中所有的成员
接口的继承是多继承,一个接口可以有多个父接口
子接口可以继承到所有父接口的成员
一个类实现多个接口,父接口不能出现有功能冲突的方法,接口在继承时也一样
父类和接口的功能分配,
父类中放主要的功能,接口中放额外的功能,作为父类的补充
父类和接口中出现相同的方法,
接口中的方法都是抽象的,要通过子类写的具体的实现,子类中调用方法的时候,功能只有子类中的一份
接口的应用可以指向实现类的对象,与多态类似
存在上下转型
向上转型后只能访问接口中的成员
向下转型后可以访问实现类中的成员
多态体现
向上转型后调用接口方法时,实际调用的是实现类中的重写实现
接口在1.8后的新特性
static方法:可以再接口中定义静态方法,静态方法是有实现部分的,只能有接口调用,接口的引用和实现类都不能实现
default方法,修饰接口的时候default修饰方法可以添加默认的实现部分实现接口的时候可以重写这些方法,也可以不重写
成员内部类
定义在一个类的内部的类,与外部类的成员变量,成员方法平等,成员之间可以互相调用
使用
外部类的一个成员部分,创建内部类对象时,必须依赖外部类对象。
Outer outer = new Outer();
Inner inner = outer.new Inner();
Inner inner1 = new Outer().new Inner();
书写位置:与属性、方法平级别,且没有使用 static 修饰的类。
访问权限:内部类可以是任意的访问权限。
成员内部类中,不能写静态属性、静态方法。
编译之后生成的字节码文件格式:外部类 $ 内部类 .class
实例化对象,需要借助外部类的对象完成。
静态内部类
在类的内部定义,与实例变量、实例方法同级别的,使用static修饰的类
使用
不依赖外部类对象,可以直接创建或通过类名访问。
Outer.Inner inner = new Outer.Inner();
书写位置:和类中的属性、方法平级,且使用关键字 static 修饰
静态内部类中,可以写属性、方法、构造方法 ...
静态内部类中,可以写静态属性、方法
编译之后生成的字节码文件,格式:外部类 $ 内部类 .class
对象的实例化,不需要借助外部类对象。
局部内部类
定义在外部类的方法中,作用范围和创建对象范围仅限于当前方法。
局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相
同,变量必须修饰为 fifinal 。
不能使用访问权限修饰符修饰。
书写位置:写在一个类的方法内部,作用域仅限于当前方法。
局部内部类,编译后生成的字节码文件格式:外部类 $ 序号内部类名 .class
通过局部内部类实现了功能的私有化 , 并对方法内部的代码进行了整理 , 增强了代码的可读性和
可操作性 .
final: 被 final 修饰的变量会被放在常量区 , 而常量区的值存在的时间要大于局部变量所在的
方法 , 相当于从原来的基础上扩大了作用域
当方法中同时存在局部内部类与局部变量时 , 局部变量的使用范围就会从原来的基础上进
行扩大 .
匿名内部类
没有名字的类
一切特征与局部内部类相同。
必须继承一个父类或者实现一个接口。
定义类、实现类、创建对象的语法合并,只能创建一个该类的对象。
当只用到当前子类的一个实例对象的时候 , 定义好马上使用 , 使用完立刻释放
当不好起名字的时候
可以更好的定义运行时的回调
第一种方式 : 使用已有的子类创建匿名子类对象
new + 父类的名字 / 接口的名字 + () + { 写当前子类的成员 } + ;
除了 new Object 类是匿名对象 , 其他所有类的匿名对象本质上都是匿名子类对象
内部类作用
间接实现了多继承
方便定义
只有外部类可以访问创建的内部类的属性和方法 , 包括私有方法
同一个包中其他的类不可见 , 有了很好的封装性