1、为什么要面向接口编程,它有什么好处?
拓展性强,可以动态的更改实现类而不用改动代码。
2、jdk1.8前后的接口变化
jdk1.8以前的特性:
1、可以有属性,但属性为常量。
2、可以有方法,但方法必须是抽象方法或者静态方法。
可以写静态方法的原因是:接口也是类,具有类的属性和方法。
不可以写一般方法的原因是:接口不可以new,即没有对象,所以就没有对象所具有的一般方法。
jdk1.8以后的特性:
1、可以写默认方法,并且默认方法有方法体。子类可以继承,也可以重写。
3、函数式接口,Lambda表达式
在java中类是一等公民,传值可以以类的形式,对象的形式传,但没有办法传行为,想要传行为需要包装在类/对象中。
函数式编程里函数是一等公民
- 什么是函数式接口
接口中有且只有一个抽象方法,可以有多个默认方法。
像这样的接口可以隐式的转换为lambda表达式。 - Lambda表达式的演变?
Lambda表达式看似是函数,实则是匿名内部类。
public interface Person{
void say();
}
public class Tom{
public static void main(String[] args){
Person tom=new Person(){
@Override
public void say(){
System.out.println("say");};
tom.say();
}
}
new Person(){ }属于匿名内部类,没有名字,不能复用。
明明是个类,我可以当做函数来用。因为这个类中最关键的是类中唯一的一个方法。这个可以理解为函数式编程。
public interface Person{
void say(String msg);
}
public class Tom{
public static void main(String[] args){
Person tom=(msg)->{System.out.println("say"+msg);};
tom.say();
}
}
把以上形式成为函数式的表达方式,完全看不出类的感觉,但它依旧是匿名内部类,只是表面上看更像函数了。
这里知道传入的参数为String类型
- 知道的内容:
通过=左边的Person我们知道匿名内部类是哪个类型的,而这个类是一个函数式接口,里面有且只有一个抽象方法,我生成出来的这个Person类就是要使用那个唯一的方法的,所以这里知道匿名内部类是Person类,那么我们就知道里面有什么方法,方法中的类型我们也是知道的,
- 不知道的内容:
我们不知道的是方法中传入的是哪个参数。
//只有一句话的情况,大括号可以不写。
//只有一句话的情况,返回值return可以不写
//只有一个参数的话,括号可以省略
Person tom=msg->System.out.println("say"+msg);
个人总结:
将相同的部分去掉,只展示不同的部分,如此一来最后展示的效果类似于函数。
- 函数与方法的区别?
方法属于某个对象,函数独立存在。