接口
-
普通类class:只有具体实现
-
抽象类abstract:具体实现和规范(抽象方法)都有!
-
- 接口interface:只有规范!自己无法写方法 ,是专业的约束!约束和实现分离:面向接口编程!
-
接口不能被实例化,因为接口中没有构造方法
-
接口就是规范,定义的是一组规则,体现了现实世界中**“如果你是…则必须能…”**的思想。
- 如果你是天使,则必须能飞
- 如果你是汽车,则必须能跑
- 如果你是好人,则必须干掉坏人
- 如果你是坏人,则必须欺负好人
-
接口的本质是契约,就像法律一样,制定好后大家都必须遵守
-
面向对象的精髓,是对对象的抽象,最能体现这一点的就是接口。
-
声明类的关键字是class , 声明接口的关键字是interface。
- 接口中的所有定义的方法其实都是抽象的public abstract
- 接口中的所有定义的属性其实都是静态的常量 public static final(不常用)
//interface是定义的关键字 public interface UserService{ //接口中的所有定义的方法其实都是抽象的public abstract void run(String name); //不用加修饰符,前面修饰都是public abstract // 接口中的所有定义的属性其实都是静态的常量 public static final int AGE = 99;//public static final int AGE = 99; }
-
注意:接口都必须要有实现类!通过implements关键字实现接口,而且实现了接口的类,就需要重写接口中的方法!
//定义有增删改查的方法的接口 public interface UserService{ void add(String name); void delete(String name); void update(String name); void query(String name); } //定义实现接口的类,必要要重写接口中的所有方法 public class UserServiceImpl implements UserService{ @Override public void add(String name) { } @Override public void update(String name) { } @Override public void delete(String name) { } @Override public void query(String name) { } }
-
接口可以被多继承!即一个类可以实现多个接口
//定义另外一个接口类TimeService public interface TimeService{ void timer(); } //然后UserServiceImpl可以实现两个接口,TimeService和UserService但必须重写两个接口中的方法 public class UserServiceImpl implement UserService,TimeService{ @Override public void add(String name) { } @Override public void update(String name) { } @Override public void delete(String name) { } @Override public void query(String name) { } @Override public void timer() { } }
- Java8新特性,只有一个方法的接口叫做函数式接口,可以使用lambda表达式简化.
格式:(parameters) -> expression
- Java8新特性,只有一个方法的接口叫做函数式接口,可以使用lambda表达式简化.
() -> 5 //不需要参数,返回值为5
x -> 2 * x //接收一个参数(数字类型),返回其2倍的值
(x,y) -> x-y //接收两个参数(数字类型),并返回他们的差值
(int x, int y) -> x + y // 4. 接收2个int型整数,返回他们的和
(String s) -> System.out.print(s) //接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
public class Lambda
{
public static void main(String[] args) {
Lambda lambda = new Lambda();
//类型声明
MathOperation addition = (int a,int b) -> a+b;
//不用类型声明
MathOperation subtraction = (a,b) -> a - b;
System.out.println(lambda.operate(10,5,addition));
System.out.println(lambda.operate(10,5,subtraction));
}
interface MathOperation{
int operation(int a,int b);
}
interface GreetingService{
void sayMessage(String message);
}
private int operate(int a,int b,MathOperation mathOperation){
return mathOperation.operation(a,b);
}
}
- Lambda 表达式主要用来定义行内执行的方法类型接口,例如,一个简单方法接口。在上面例子中,我们使用各种类型的Lambda表达式来定义MathOperation接口的方法。然后我们定义了sayMessage的执行。
- Lambda 表达式免去了使用匿名方法的麻烦,并且给予Java简单但是强大的函数化的编程能力。