5.1注解
JDK中提供了三个内置注解@Override、@Deprecated、@SuppressWarnings
5.1.1 准确覆写
提供一个标识符,表明下面的方法是一个覆写方法,一旦覆写失败则会直接认为是语法错误。
package www.bit.java.testdemo; class Person { @Override // 追加了此注解后将明确的表示该方法是一个覆写的方法,如果覆写错误会出现语法错误 public String tostring() { return "ABCED" ; } } public class TestDemo { public static void main(String[] args) { System.out.println(new Person()); } } |
在很多开发工具中,覆写的方法会帮你直接添加@Override标记。
5.1.2 声明过期
在多个版本更新中,如果发现后续你的某些方法不再使用,但是为了保持和前面版本的兼容性而不能删除的时候,则可以加入@Deprecated表明这个方法不建议使用,但是即使你使用了也不会出错。
5.1.3 压制警告
当调用了某些操作可能产生问题的时候就会出现警告进行,但是警告信息并不是错,这个时候又不想总提示警告,这个时候可以使用压制警告。
5.2 lambda表达式
JDK1.8 开始支持lambda表达式。
语法:(参数)->单行语句;或者 (参数) -> {} ;
lambda表达式使用了函数式编程思想,简单来说就是定义一个函数式编程接口。然后再其它方法调用的时候可以简化操作。定义函数式编程接口的时候要使用@FunctionalInterface注解来说明,此时这个接口中就只能拥有一个方法。
@FunctionalInterface // 是一个函数式编程接口,只允许有一个方法 interface IMessage { public void print() ; // 这是一个接口,接口中的抽象方法必须由子类覆写。 }
public class TestDemo { public static void main(String[] args) { // 函数式编程的使用,目的还是输出一句话 IMessage message = () -> System.out.println("Hello World"); message.print(); } } |
5.3 方法引用
JDK1.8开始引入方法引用的概念,类似于别名,常与函数式编程使用。方法引用的类型有四种形式:
1. 引用静态方法:类名称::static 方法名称 ;
2. 引用某个对象的方法:实例化对象 :: 普通方法 ;
3. 引用某个特定类的方法: 类名称 :: 普通方法 ;
4. 引用构造方法: 类名称 :: new 。
package www.bit.java.testdemo; @FunctionalInterface // 是一个函数式编程接口,只允许有一个方法 interface IUtil<P,R> { public R switchPara(P p) ; }
public class TestDemo { public static void main(String[] args) { IUtil<Integer,String> iu = String :: valueOf ; //进行方法引用 String str = iu.switchPara(1000) ; // 相当于调用了String.valueOf(1000) System.out.println(str.length()); } } |
5.4 枚举
enum(枚举)本质上相当于Class定义的类,继承了java.lang.Enum父类。
enum是一个关键字,使用enum定义的枚举类本质上就相对于一个类继承了Enum这个抽象类而已。在Enum类中有以下方法:
1.构造方法:protected Enum(String name, int ordinal)
2.取得枚举名字:public final String name()
3.取得枚举序号:public final int ordinal()
4.取得所有的枚举数据:values()
enum Sex { MALE("男"),FEMALE("女") ; private String title ; private Sex(String title) { this.title = title ; } @Override public String toString() { return this.title ; } } class Person { private String name ; private int age ; private Sex sex ; public Person(String name, int age, Sex sex) { super(); this.name = name; this.age = age; this.sex = sex; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]"; }
} public class TestDemo { public static void main(String[] args) { Person per = new Person("张三", 20, Sex.MALE) ; System.out.println(per); } } |
5.5 接口定义加强
对于接口来说,一旦缺少了某个方法的声明,那么和他相关的子类就需要实现这个方法,当这个类数量特别大的时候,编程就变得很麻烦。在JDK1.8之后,可以使用两种新的结构:
可以使用default来定义普通方法,需要通过对象调用
可以使用static来定义静态方法,通过接口名就可以调用
interface IMessage { public default void fun() { // 追加了普通方法,有方法体了 System.out.println("Hello IMessage"); } // 可以直接由接口名称直接调用 public static IMessage getInstance() { return new MessageImpl() ; } public void print() ;
} class MessageImpl implements IMessage {
@Override public void print() { System.out.println("Hello MessageImpl"); }
} public class TestDemo { public static void main(String[] args) { IMessage message = IMessage.getInstance() ; System.out.println(message); message.print(); message.fun(); } } |
5.6 内建函数式接口
java.util.function 实际上函数式编程分为以下四种接口:
1. 功能型函数式接口:public interface Function<T, R> R apply(T t);
2. 供给型函数式接口: public interface Supplier T get();
3. 消费型函数式接口:public interface Consumer void accept(T t);
4. 断言型接口:public interface Predicate boolean test(T t);