接口
接口定义
- 接口中不能有实例属性
- 接口中也不能实现方法
- 这两个应该交给实现接口的类完成
- 接口不是类,不能使用
new来实例化一个接口 Java8之前接口中不能定义静态方法,可以包含常量- 接口中的常量属性自动设定为
public static final
步骤
- 将类声明为实现给定的接口
- 对接口中的所有方法进行定义
- 需要使用关键字
implements来实现某个接口
在接口中所有方法都是自动的
public
实现接口时,必须把方法声明为public,不然编译器会有权限访问警告
- Java语言是一种
强类型语言 - 在调用方法时候,编译器会检查方法是否存在
接口与继承区别
- 每个类都只能继承一个类
- 每个类可以实现多个接口
- 代码示例
public class Studnet extends People implements Comparable, Cloneable{
//代码。。。。
}
静态方法
Java8中允许在接口中定义静态方法且可以实现,默认方法一样
解决默认方法冲突
- 父类优先
- 如果父类和接口中有一个方法是同名的,那么有相同参数类型的默认方法会被忽略(类优先原则)
- 接口冲突
- 如果一个接口提够了默认方法,另一个接口也提供了相同方法,必须覆盖这个方法来解决冲突
接口回调
- 是一种常见的程序设计模式
- 可以指出某个特定事件发生时应该采取的动作
克隆
- 对于每一个类,都需要确定
- 默认的
clone方法是否满足要求 - 是否可以在可变的子对象上调用
clone开修补默认clobe的方法- 以上两个必须要求类
- 实现
Cloneable接口 - 重新定义
clone方法,并指定public访问修饰符
- 实现
- 以上两个必须要求类
- 是否不应该使用
clone
- 默认的
lambda表达式
- Java8的新特性,用来处理代码块
语法
- 代码示例
first.len() - second.len();
(Integer first, Integer second) -> first.len() - second.len();
lambda表达式就是一个代码块- 也可以称为函数式接口
内部类
- 是定义在一个类中的类
- 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据
- 内部类可以对同一个包的其他类隐藏起来
- 定义一个回调函数并不想写很多代码,使用匿名内部类
- 示例代码
public class People{
//People类中的内部类
class Student{
}
}
- 内部类的所有静态属性都必须是
final
局部类
- 存在于方法中或者代码块中的类
- 代码示例
public void run(){
class People{
}
}
- 局部类不能使用`public`或者`private`进行修饰
- 对外部世界完全隐藏
- 局部类只能引用定义为`final`的局部变量
匿名内部类
- 不需要命名的局部内部类
- 匿名内部类不能有构造器
- 可以将构造器的参数传递给父类构造器
- 只有内部类可以声明为
static - 静态内部类的对象除了对生成他的外部类对象的引用特权外,和其他内部类一样
- 在内部类不需要访问外部类对象的时候,应当使用静态内部类
- 静态内部类可以有静态属性和方法
- 声明在接口中的内部类,自动称为
static和public类
代理
- 有一个表示接口的
Class对象,它的确切类型在编译时无法知道 - 使用反射机制又很慢
- 代理机制是一种更好的解决方案
- 代理类可以在运行时创建全新的类,能够实现指定的接口
- 指定接口所需要的全部方法
Object类中的全部方法
- 不能在运行时调用,提供了一个调用处理器
创建代理类
- 需要使用
Proxy类的newProxyInstance方法,有三个参数- 一个类加载器
- 一个
Class对象数组 - 一个调用处理器
代理类的特性
- 所有代理类都扩展于
Proxy类。一个代理类只有一个实例-->调用处理器,定义在Proxy的父类中 - 所有的代理类都覆盖了
Object类中的方法toString、equals、hashCode - 没有定义代理类的名字,虚拟机中的
Proxy类将生成一个以字符串$Proxy开头的类名 - 特定的类加载器和预设的一组接口,只能有一个代理类
- 代理类一定是
public和final - 可以调用
Proxy类中的isProxyClass方法检测一个特定的Class对象是否代表一个代理类
浙公网安备 33010602011771号