面向对象中的JDK8 接口和 Lambda
1.Final 在匿名内部类 jdk7 和 jdk8 的区别
Jdk8 开始匿名内部类在使用外部局部变量时,局部变量可以不加 final,但是也不能修改局部变量
JDK8中,对final在内部类的用法进行了修改实例如下 :在JDK8中而在JDK7中必须加final进行修饰
//JDK8中
public class HelloWorld {
void test(){
}
public static void main(String []args) {
int age = 19;//可以不加final修饰
HelloWorld h1 = new HelloWorld(){
void test(){
System.out.println(age);
}
};
h1.test();
/*
* 匿名内部类使用外部的局部变量,
* 可以不加final修饰,但是不能修改变量
*/
//age = 20;
}
}
2.JDK8接口
-
官方解释:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
-
我的解释:接口可以理解为一种特殊的类,里面全部是由全局常量和公共的抽象方法所组成。接口是解决Java无法使用多继承的一种手段,但是接口在实际中更多的作用是制定标准的。或者我们可以直接把接口理解为100%的抽象类,既接口中的方法必须全部是抽象方法。(JDK1.8之前可以这样理解),以及接口只能被实现,可以多实现,一个类可以实现多个接口。
-
(一)基本接口
1.极端抽象类(原来的理解:接口中全部都是抽象方法)
(1)接口中的方法全是抽象方法
(2)接口中的成员变量全是常量
(3)接口中的所有成员权限都是 public
(4)修饰符 interface,不是 class
(5)接口实例
public interface interFace {
}
JDK8特有的语法
JDK8中新接口处新了加两种方法JDK8默认方法以及JDK8静态方法
-
JDK8默认方法:以default关键字对方法进行修饰。
-
JDK8静态方法:以static关键字对方法进行修饰。
-
以上两种方法都是JDK8中新加入的在JDK8以前是没有这两种方法的
public interface InterfaceDemo {
int STATE_SUCCESS = 200;
void test() ;
//-------------jdk8当中特有的语法-------------------//
default void show() {//被实现类对象继承调用
System.out.println("jdk8接口-默认方法");
}
static void print() {//用接口名称进行调用
System.out.println("jdk8接口-静态方法");
}
}
函数式接口
/**<p>Title:interFace</p>
* <p>Description: 接口中的函数式接口</p>
* @author shishuai
* @datetime 2019-01-28 23:12
* @version 1.0 //当前版本
* @since 1.0 //起始版本
*/
@FunctionalInterface
public interface interFace {
void test();
}
接口中可以写哪些内容
1.常量
2.抽象方法
3.默认方法
4.静态方法
- 接口实现类
1.实现某个接口的类,称为接口实现类
2.通常接口实现类会以 Impl 为结尾
interface Foo{}//接口
class FooImpl implementes Foo{}//类实现接口
3.接口实现类需要实现接口中所有抽象方法
4.接口实现类和接口之间是一个实现关系,属于继承,实现类和接口之间是多态关系
Foo f1 = new FooImpl();
f1 和 new FooImpl()// 是一个多态的关系
类与类,类与抽象类,类与接口,抽象类与接口,接口与接口之间的关系
1.类与类之间是继承关系,只能单继承,用 extends 关键字进行描述
2.类与抽象类之间是继承关系,只能单继承,用 extends 关键字进行描述
3.类与接口之间是实现关系,类可以同时实现多个接口,用 implements 关键字进行描述
4.抽象类与接口之间是实现关系,用 implements 关键字进行描述
5.接口与接口之间是继承关系,支持接口的多继承,用 extends 关键字进行描述
三、Lambda 表达式
作用:最直观的作用就是使得代码变得异常简洁。
@FunctionalInterface
public interface Foo {
/**
* 传入一个label标签,传入一个对应的值,显示一组结果
* @param label
* @param value
*/
void show(String label,String value);
}
public class Lambda {
void show(String label,String value);
//-------匿名内部类
Foo f1 = new Foo() {
@Override
public void show(String label, String value) {
System.out.println("<<"+label+"="+value+">>");
}
};//正常的的写法而实际上起到作用的只有 System.out.println("<<"+label+"="+value+">>");这一句代码
//--------Lambda表达式
public static void main(String[] args) {
Foo f2 = (label,value) -> System.out.println("<<"+label+"="+value+">>");
//接受一个 label,value 对象,并在控制台打印,不返回任何值(看起来像是返回void)
//其中的()- >被称为lambda表达式
f2.show("年龄", "20");
}//使用Lambda表达式的写法
由上述两个得知Lambda表达式为我们写代码提供了一个更加快捷和方便的方式。