目录
接口
接口定义
- 接口中不能有实例属性
- 接口中也不能实现方法
- 这两个应该交给实现接口的类完成
- 接口不是类,不能使用
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
对象是否代表一个代理类