接口

接口定义

  • 接口中不能有实例属性
  • 接口中也不能实现方法
  • 这两个应该交给实现接口的类完成
  • 接口不是类,不能使用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
  • 静态内部类的对象除了对生成他的外部类对象的引用特权外,和其他内部类一样
  • 在内部类不需要访问外部类对象的时候,应当使用静态内部类
  • 静态内部类可以有静态属性和方法
  • 声明在接口中的内部类,自动称为staticpublic

代理

  • 有一个表示接口的Class对象,它的确切类型在编译时无法知道
  • 使用反射机制又很慢
  • 代理机制是一种更好的解决方案
  • 代理类可以在运行时创建全新的类,能够实现指定的接口
    • 指定接口所需要的全部方法
    • Object类中的全部方法
  • 不能在运行时调用,提供了一个调用处理器

创建代理类

  • 需要使用Proxy类的newProxyInstance方法,有三个参数
    • 一个类加载器
    • 一个Class对象数组
    • 一个调用处理器

代理类的特性

  • 所有代理类都扩展于Proxy类。一个代理类只有一个实例-->调用处理器,定义在Proxy的父类中
  • 所有的代理类都覆盖了Object类中的方法toStringequalshashCode
  • 没有定义代理类的名字,虚拟机中的Proxy类将生成一个以字符串$Proxy开头的类名
  • 特定的类加载器和预设的一组接口,只能有一个代理类
  • 代理类一定是publicfinal
  • 可以调用Proxy类中的isProxyClass方法检测一个特定的Class对象是否代表一个代理类
posted on 2023-03-03 20:42  ZmBoy  阅读(20)  评论(0)    收藏  举报