一、概念
1. 接口:是一种标准,接口的实现者和使用者都必须遵循的约定。
2. 接口语法:【jdk7.0】
- (1)接口关键字: interface
interface 接口名{}
- (2)接口不能创建对象,但是可以声明引用
接口名 引用名;
- (3)接口中所有的属性都默认为公开、静态、常量(被 public static final 修饰)
- (4)接口中所有的方法都默认为公开、抽象方法(被 public abstract 修饰)
- (5)接口中没有构造方法
二、实现类
1. 实现的语法
class 类名 implements 接口名{}
2. 实现类的要求
如果实现类不想成为抽象类,则需要覆盖接口中所有的抽象方法,而且覆盖接口中方法时,访问权限必须是 public (接口中所有的方法默认权限为 public )
3. 应用
- (1) 接口名 引用名 = new 实现类类名();
父类型 子类型
- (2)利用接口类型的引用(父类型),存储了实现类类型的对象(子类型),体现多态的应用
三、接口之间的继承性
1. 接口与接口之间为多继承关系
- (1)一个接口可以同时继承多个接口,接口与接口之间为多继承的关系
- (2)语法:
interface 接口名 extends 父接口1,父接口2{}
- (3)如果一个类实现接口,需要实现所有方法,包括父接口的
2. 类和接口之间为多实现的关系
- (1)一个类同时可以实现多个接口,即:类和接口之间为多实现的关系
- (2)语法:
class 类名 implements 接口1,接口2{}
- (3)如果类实现多个接口时,需要把实现所有接口中所有的抽象方法全部覆盖(否则实现类为抽象类)
3. 一个类实现多个接口的同时,继承一个父类
- (1)语法:
class 类名 extends 父类 implements 接口,接口2{}
- (2)注意: 必须是 继承在前,实现在后(先继承后实现)
四、接口的影响
由于接口与接口之间为多继承,类与接口之间为多实现的关系,所以利用父类型(父类 + 父接口)存储子类型的对象体现多态,而且让多态更加的灵活和多元化
注意: 以哪一个接口类型的引用调用方法,只能调用该接口中定义的方法
五、接口的新特性[jdk8.0+]
1. jdk8.0中的特性:
- (1)默认方法:
a. default 返回值类型 方法名(形参列表){}
b. 接口中 default 代表 此方法可以带有方法实现部分
c. 默认方法的访问权限 为 public
- (2)静态方法:
a. static 返回值类型 方法名(形参列表){}
b. 接口中 static 代表方法可以带有实现部分
c. 静态方法的默认访问权限 为 public
d. 使用: 接口名.静态方法名(实参);
2. jdk9.0中的特性:
- (1)私有方法: 可以带有方法的实现部分
- (2)语法:
private 返回值类型 方法名(形参列表){}
- (3)通常用于定义接口中内部组件(降低代码冗余 )
六、接口的分类
1. 普通接口: 接口中有多个抽象方法,或许还有属性
开发中最常见
2. 常量接口: 接口中没有抽象方法,只有属性【了解】
interface IA{
int m = 8;
}
3. 标记接口: 也称为 空接口,接口中没有定义任何属性和抽象方法【开发会用】
interface IC{}
例如: 对象序列化
4. 函数式接口: 接口中有且仅有一个抽象方法【重点】
interface IB{
void m1();
}
函数式接口:用于JDK8.0中Lambda表达式开发
一、内部类的理解
1. 内部类:定义在一个类内部的类被称为内部类
class Outer{
class Inner{} // 内部类
}
2. 内部类编译之后生成独立的.class文件,命名为:
外部类的类名$内部类的类名.class
3. 内部类可以直接使用外部类的属性和方法
4. 内部类的分类:成员内部类、静态内部类、局部内部类、匿名的内部类
- (1)成员内部类:
class Outer{
class Inner{} // 成员内部类
}
- (2)静态的内部类:
class Outer{
// 静态内部类
static class Inner{}
}
- (3)局部内部类:定义在方法中
class Outer{
public void test(){
// 局部内部类
class Inner{}
}
}
- (4)匿名内部类:【重点】
二、匿名内部类
1. 匿名内部类的特点
- (1)类本身没有自己的类名,是一个特殊局部内部类
- (2)匿名内部类必须继承一个父类或是实现一个接口
- (3)匿名内部类只能创建一个对象,而且对象的创建和类的定义一起完成
2. 语法:
public class Test2{
public static void main(String[] args){
// 利用匿名内部类完成IA接口的实现
IA ia=new IA(){
public void m1(){
System.out.println("实现..");
}
};
ia.m1();
}
}
interface IA{
void m1();
}
三、Lambda表达式
1. Lambda表达式:对匿名内部类的进一步简化,大大的减少了代码的冗余
2. Lambda表达式应用场景:对函数式接口的实现(接口中有且只有一个抽象方法称为函数式接口)
3. 语法:
接口名 引用 = (数据类型 参数名,数据类型 参数名)->{
// 方法的实现部分
};
- (1)没有参数、没有返回值
接口名 引用 = ()->{
// 方法的实现部分
};
注意:如果 {} 中仅有1条语句时, {} 可以省略
- (2)有参数,没有返回值
接口名 引用 = (数据类型 参数名,数据类型 参数名)->{
// 方法的实现部分
};
注意: () 中的数据类型可以省略的
IB ib2 = (x,y) -> System.out.println(x+y);
ib2.m1(2.3,9.5);
示例代码:
public class Test5{
public static void main(String[] args){
IB ib1 = (double d1,double d2)->{
System.out.println(d1+"-"+d2);
};
ib1.m1(3.8,9.8);
}
}
interface IB{
void m1(double d1,double d2);
}
- (3)有返回值,有参数
接口名 引用 = (数据类型 参数名,数据类型 参数名)->{
// 方法的实现部分
return 值;
};
注意: {} 中只有一条 return 语句时, {} 和 return 可以一起省略
IC ic2 = (m,n)-> m+n;
示例代码:
interface IC{
int m2(int a,int b);
}
补充代码示例(对应Lambda表达式)
public class Test4{
public static void main(String[] args){
IA ia = ()->{
System.out.println("实现..");
};
ia.m1();
IA ia2 = ()-> System.out.println("哈哈哈...");
ia2.m1();
}
}
interface IA{
void m1();
}
idea的部分快捷键
psvm -> enter即可
sout -> enter System.out.println();