一、什么是接口
1、接口时一套标准化的协议(必须要配套使用)。
2、接口的作用是:做数据交换
3、接口的关键字是:interface
语法: [访问修饰符] 关键字interface 接口名{
接口里面的属性都是 pubic static final 默认修饰的常量
接口里面的方法默认都是 public 抽象关键字abstract 修饰的方法();
}
使用:格式如:public class 类名 implements 接口名1,接口名2{};
4、接口是让别的类用来调用的,所以通常接口的访问修饰符是public。接口如果不写访问修饰符,其默认是public
5、接口是抽象访问和常量值定义的集合(接口中的方法必须是抽象方法,接口定义的属性必须是常量)
(1)接口中的方法默认访问修饰符是public,并且是通过abstract进行修饰的抽象方法
(2)接口中属性是公共静态的常量,即接口中定义的属性都会默认加上 public stati final 作为前缀
6、接口可以看作特殊的抽象类,只不过这个抽象类中全部都是公共的静态常量,都是公共的抽象方法,比抽象类更加标准
7、jdk1.8之后的版本接口里面是允许定义static修饰的方法、允许定义default修饰的方法
8、一个类可以实现多个接口,若两个接口里有default修饰的相同方法名的方法,此时实现类必须得覆写default修饰的方法
二、接口的特性
1、实现接口的类必须实现接口中的抽象方法
2、多个类可以实现同一个接口
3、实现了接口的类可以被继承
4、接口和接口之间是可以多继承的。
5、接口和实现类的多态性:
6、接口和抽象类都遵循开闭原则(对修改关闭,对扩展开放)
三、接口和抽象类的区别
1、相同点:
(1)接口和抽象类都不能直接实例化,抽象类如果需要实例需要被继承,之后通过抽象类的引用指向子类的实例对象(变相的创建了实例对象)
(2)抽象类里的抽象方法必须全部被子类实现,如果子类不能全部实现父类的抽象方法,那么该子类只能是抽象类;一个类实现接口的时候,如果不能全部实现接口中的方法,那么这个类只能是抽象类。
(3)接口和抽象类都是用来抽象具体对象的,但是接口的抽象级别更高
(4)接口和抽象类都遵循开闭原则(对修改关闭,对扩展开放)
2、不同点:
(1)抽象类要被子类继承;接口要被类实现
(2)抽象类中可以有非抽象方法;接口中除了static和default修饰的方法,其他全为抽象方法
(3)抽象类中可以有普通成员变量;接口中只能定义公共静态常量
(4)抽象类是重构的结果;接口是设计的结果
(5)抽象类只可单继承;接口可以多继承
(6)抽象类可以有构造方法;接口不可以有构造方法
四、接口回调
1、接口回调是在开发中一种常用的设计手段,也可以当作一个处理问题的模型。运行接口的实现类实例的对象可以用接口类型的引用接收,调用时,用接口类型的引用名.方法名可以调用实现类中覆写过的接口中的方法。这种方式叫做接口回调。
2、应用场景:分层间的互相协作
五、内部类
1、Java中支持一个类在一个类的内部再定义一个类,我们称定义在一个类中的类为内部类或成员内部类(Inner Class)。
2、成员内部类
(1)成员内部类可以访问外部类的所有成员变量和方法
(2)内部类属于类,需要通过 类名.内部类 的方式得到这个类。
(3)成员内部类的创建方式
创建外部类的实例对象-->通过外部类访问内部类创建内部的实例对象
InnerClass outClass = new InnerClass();
InnerClass.InnerClass1 b = outClass.new InnerClass1();
其中new InnerClass1() 是outClass类中的构造方法
(4)成员内部类是依附于外部类而存在的。如果要创建成员内部类对象,则必须得有一个外部类对象。
(5)成员内部类属于外部类的成员,可以用priate修饰,但是只能在外部类内部进行访问。修饰符对成员内部类的作用与普通的成员方法作用范围相同。
3、局部内部类
(1)定义在一个方法或者一个作用域里面的类,它和成员内部类的区别是:局部内部类的访问权限仅限于方法或者作用域内
(2)局部内部类的访问修饰符不能是public、protected、default、private 修饰的,也不能用static进行修饰
(3)局部内部类创建对象时,要放在局部内部类加载完之后(因为代码的执行时从上到下的)
4、匿名内部类(重点:必须掌握)
(1)匿名内部类使用最多的场景时做事件监听,使用匿名内部类可以使我们的代码可维护性更高
(2)匿名内部类没有引用指向,和匿名对象一样只能使用一次
(3)可以实现抽象类里的抽象方法
(4)接口也可以使用匿名内部类的方式去实现
(5)匿名内部类被我们大量使用在多线程中,因为我们线程实现的方式有继承Thread类和实现Runnable接口两种
(6)格式: new 类名/接口/抽象类(){
}
(7)本质:匿名内部类会隐式的继承一个类或者实现一个接口,或者说,匿名内部类是一个继承了该类或者实现了该类接口的子类匿名对象。
5、静态内部类(重点:必须掌握)
(1)静态内部类不依赖外部类
(2)静态内部类创建对象
外部类.静态内部类 引用名 = new 静态内部列构造器();
(3)静态内部类中不能使用外部类中非static修饰的成员变量和方法。