1.接口的默认方法
1.在java1.8之前
在java1.8之前java当中接口里面的方法默认都是public abstract修饰的抽象方法并且没有方法体
2.static方法
java8可以在接口当中定义static接口,要求如下
1.使用static修饰接口当中的方法,方法必须要有方法体
2.接口当中的static方法只能通过:接口名.方法名 调用
3.接口的static方法不能被子接口继承
4.接口的static方法不能被实现类复写和直接调用
package com.imooc.lamda.bean;
public interface MyInterface {
void test();
/**
* java8新特性:在接口当中可以使用static修饰方法,不过此方法必须要有方法体
*/
public static void staticMethod() {
System.out.println("Interface当中的static方法...");
}
}
*******************************************************************************************
package com.imooc.lamda.bean;
public class Test {
public static void main(String[] args) {
MyInterface.staticMethod();
}
}
3.default方法
接口当中的default方法必须要有方法体
1.接口当中的default方法可以被实现类继承
package com.imooc.default1.bean;
public interface MyInterface1 {
public abstract void test();
default void defaultMethod() {
System.out.println("这是defaultMethod...");
}
}
***************************************************************************************************
package com.imooc.default1.bean;
public class MyInterface1Impl implements MyInterface1 {
@Override
public void test() {
}
//接口当中的default方法是默认继承的,要想重写可以显示的Override
}
***************************************************************************************************
package com.imooc.default1.bean;
public class Test {
public static void main(String[] args) {
MyInterface1Impl myInterface1Impl=new MyInterface1Impl();
myInterface1Impl.defaultMethod();//这是defaultMethod...
}
}
2.接口当中的default方法可以被子接口继承
package com.imooc.default1.bean;
public interface MyInterface1 {
public abstract void test();
default void defaultMethod() {
System.out.println("这是defaultMethod...");
}
}
************************************************************************************************
package com.imooc.default1.bean;
public interface MyInterface2 extends MyInterface1 {
}
***************************************************************************************************
package com.imooc.default1.bean;
public class MyInterface2Impl implements MyInterface2 {
@Override
public void test() {
// TODO Auto-generated method stub
}
}
*****************************************************************************************************
package com.imooc.default1.bean;
public class Test {
public static void main(String[] args) {
MyInterface2Impl myInterface2Impl=new MyInterface2Impl();
myInterface2Impl.defaultMethod();//这是defaultMethod...
}
}
2.函数式接口
函数式接口:有且只有一个抽象方法,但是可以有多个非抽象方法的接口,函数式接口可以被隐式的转换为Lambda表达式
函数式接口注解:
在一个接口上加上@FunctionalInterface注解,这个接口就称为了一个函数式接口,如果不符合
函数式接口的标准,加这个注解的时候会报错,加他是为了更加明显
*********************************************************************************************************
@FunctionalInterface
public interface MyInterface1 {
public abstract void test();
default void defaultMethod() {
System.out.println("这是defaultMethod...");
}
}
3.Lambda表达式
Lambda表达式可以看成是对匿名内部内的简写,使用Lambda表达式时,接口必选是函数式接口
package com.imooc.java8.lambda;
public interface MyInterface {
void test();
}
*********************************************************************************************************
package com.imooc.java8.lambda;
import com.imooc.lamda.bean.MyInterface;
public class Test {
public static void main(String[] args) {
/**
* 使用匿名类,相等与new MyInterfaceImpl();
* public class MyInterfaceImpl implements MyInterface {
* @Override
* public void test() {
*
* }
* }
* 接口是不能new的,此处new的是接口的实现
*/
MyInterface myInterface=new MyInterface() {
@Override
public void test() {
System.out.println("这是接口当中方法的重写...");
}
};
myInterface.test();//这是接口当中方法的重写...
}
}
Lambda表达式演示
package com.imooc.java8.lambda;
public interface MyInterface {
int add(int a,int b);
}
*****************************************************************************************************
package com.imooc.java8.lambda;
public class TestDemo {
public static void main(String[] args) {
System.out.println("************************匿名内部类的方式************************");
//匿名内部类的方式
MyInterface myInterface=new MyInterface() {
@Override
public int add(int a, int b) {
return a+b;
}
};
System.out.println("************************使用Lambda表达式************************");
//使用Lambda表达式
MyInterface myInterface1=(int a,int b) -> a+b ;
MyInterface myInterface2=(a,b)->a+b;
MyInterface myInterface3=(a,b)->{
System.out.println("Lambda方法体");
return a+b;
};
System.out.println(myInterface.add(123, 456));
System.out.println(myInterface1.add(123, 456));
System.out.println(myInterface2.add(123, 456));
System.out.println(myInterface3.add(123, 456));
}
}
Lambda表达式作用域--final
package com.imooc.java8.lambda;
public class TestDemo1 {
public static void main(String[] args) {
System.out.println("***********************匿名内部类***********************");
/**
* 1.8之前,要在匿名内部内当中使用局部变量,局部变量必须要显示的指定final
* 之后的默认是用final修饰的,可以不写final,但是他的值不能修改
*/
int a=10;
MyInterface2 myInterface2=new MyInterface2() {
@Override
public void test() {
System.out.println(a);
}
};
//a=11;报错,不能修改
myInterface2.test();//10
System.out.println("***********************Lambda***********************");
int b=20;
MyInterface2 myInterface22=() ->{System.out.println(b);};
//b=11;Lambda也是一样不能修改
myInterface22.test();//20
}
}
Lambda表达式总结
语法:
(parameters) -> expression 或 (parameters) ->{ statements; }
当为返回值,一般使用expression
// 接收2个int型整数,返回他们的和
(int x, int y) -> x + y
(x,y) -> {return x+y}
// 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)
Lambda表达式的构造方法引用
package com.imooc.java8.lambda1;
public class TestDemo {
public static void main(String[] args) {
PersonFactory factory=new PersonFactory() {
@Override
public Person createPerson(String firstName, String lastName) {
return new Person(firstName, lastName);
}
};
Person person=factory.createPerson("itsource", "java");
System.out.println(person);
System.out.println("************************使用Lambda表达式*************************");
//使用Lambda表达式的常规写法
PersonFactory factory2=(firstName,lastName) ->new Person(firstName, lastName);
//使用Lambda表达式的简洁写法:构造方法引用
PersonFactory factory3=Person::new;
Person person2=factory2.createPerson("itsource", "java");
Person person3=factory3.createPerson("itsource", "java");
}
}
Lambda静态方法引用
package com.imooc.java8.lambda2;
public interface MyInterface {
int parseInt(String str);
}
*******************************************************************************************************
package com.imooc.java8.lambda2;
public class Test {
public static void main(String[] args) {
MyInterface myInterface=new MyInterface() {
@Override
public int parseInt(String str) {
return Integer.parseInt(str);
}
};
//Lambda常用方式
MyInterface myInterface2=(str) ->Integer.parseInt(str);
//Lambda静态方法方式
MyInterface myInterface3=Integer::parseInt;
}
}
Lambda实例方法引用
package com.imooc.java8.lambda2;
import java.util.function.Function;
public class TestDemo {
public static void main(String[] args) {
Function<String, Boolean> function=new Function<String, Boolean>() {
@Override
public Boolean apply(String t) {
// TODO Auto-generated method stub
return t.endsWith("as");
}
};
String t="asfda";
System.out.println(function.apply(t));
Function<String, Boolean> function2=t::endsWith;
function2.apply("asdfg");
}
}
网友评论