JavaSE之新特性概述

1.枚举

语法:

enum Color {
    RED,BLUE,GREEN;
}

使用enum关键字定义的枚举结构实际上是默认继承了Enum类的枚举类。

Enum类中存在两大属性:

  1. name:枚举对象名称
  2. ordinal:枚举对象数字下标
public final String name() : 取得枚举对象名称
public final int ordinal() : 取得枚举对象下标

取得所有枚举类对象:

枚举类.values()

枚举中定义其他结构:

  1. 枚举中若定义构造方法,构造方法必须用private封装(枚举类是多例类,枚举类外部无法产生对象);
  2. 枚举中若定义其他结构,枚举对象声明必须放在枚举类的首行。枚举中若定义其他结构,枚举对象声明必须放在枚举类的首行。

枚举实现接口:
枚举中的对象自动变为接口对象。

2.注解 @

@Override准确覆写:
当子类覆写父类方法时,此注解检查覆写的方法是否正确声明,只有满足覆写方法要求才会编译通过,否则编译出错。

@Deprecated过期声明:
建议用户不使用原有的类&方法时,可以在类或方法上@Deprecated表示在当前版本中不推荐使用。

@SuppressWarings 压制警告:
调用某些操作可能产生问题的时候会出现警告信息,但是警告信息并不是异常。

3.JDK1.5 新特性

3.1可变参数

要求设计一个方法,用于计算任意参数的整数的相加结果。

public [static] [final] 返回值 方法名称([参数类型 参数名称][参数类型 ... 参数名称]){}

(类型 . . . 参数名称)
注意:
一个方法有且只能有一个可变参数,并且放在方法的最后一个参数可变参数的本质还是数组。
foreach 循环用于数组与类集的简单输出.
静态导入:
如果类中方法全是static方法,则可以直接把这个类的方法导入进来,这样就好比像在主类中定义的 方法那样,可以被主方法直接调用。

扫描二维码关注公众号,回复: 5373597 查看本文章

3.2 泛型 - 守门员

定义:
在类定义的时候并不会设置类中的属性或方法中参数的具体类型,而是在类使用时再定义。
具体特性:https://blog.csdn.net/qq_40933663/article/details/87922802

4.JDK1.8新特性

4.1 接口定义增强

JDK1.8之后接口中允许出现以下两类方法:

  1. 使用default定义的普通方法,需要通过接口对象来调用;
  2. 使用static定义的静态方法,直接使用接口名调用。

4.2 Lambda表达式

要想使用函数式编程有一个前提:接口必须只有一个方法。如果存在两个以上的方法,无法使用函数式编程。
如果现在某个接口就是为了函数式编程而生的,在定义时只能存在一个方法,因此有一个新的注解@FunctionalInterface,此注解会检查该接口中是否只存在一个抽象方法,存在两个抽象方法以上编译报错。

语法:
方法体只有一行代码时:

(方法参数) -> 具体的方法体实现。

当方法有返回值时,单行代码的lambda表达式可以省略return语句:

@FunctionalInterface
interface IMessage {
    void print();
}
@FunctionalInterface
interface IAdd {
    int add(int x,int y);
}
public class Test{
    public static void main(String[] args) {
        IMessage msg = () -> System.out.println("hello world");
        msg.print();
        IAdd add = (p1,p2) -> p1+p2;
        System.out.println(add.add(10,20));
    }
}

当方法体有多行代码时:

(方法参数) -> {
	....
	....
	...
	[return 语句];
};
IAdd add = (p1,p2) -> {
	int result = p1+p2;
	result+=20;
	return result;
};
System.out.println(add.add(10,20));

5.方法引用-与Lambda表达式搭配使用

方法引用只是给现有方法起了个别名。

方法引用有四种形式:

5.1 引用类中静态方法

类名称 :: 静态方法名称

interface IUtil<P,R> {
    R switchPara(P p);
}
public class Test{
    public static void main(String[] args) {
        IUtil<Integer,String> util =
                String :: valueOf;
// 相当于调用String.valueOf(10);
        String str = util.switchPara(10);
        System.out.println(str.startsWith("1"));
    }
}

5.2 引用某个对象的方法

实例化对象 :: 普通方法

interface IUtil<R> {
    /**
     * public String toUpperCase()
     * @return
     */
    R switchPara();
}
public class Test{
    public static void main(String[] args) {
        IUtil<String> util =
                "hello" :: toUpperCase;
// 相当于调用了"hello".toUpperCase();
        System.out.println(util.switchPara());
    }
}

5.3 调用类中普通方法

类名称 :: 普通方法名

interface IUtil<R,P> {
    /**
     * @param p1
     * @param p2
     * @return R
     */
    R compare(P p1,P p2);
}
public class Test{
    public static void main(String[] args) {
        IUtil<Integer,String> util =
                String::compareTo;
        System.out.println(util.compare("刘","杨"));

    }
}

5.4 引用类中构造方法

类名称 :: new

class Person {
    private String name;
    private Integer age;
    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
interface IUtil<R,PN,PR> {
    R createPer(PN p1,PR p2);

}
public class Test{
    public static void main(String[] args) {
        IUtil<Person,String,Integer> util =
                Person::new;
        System.out.println(util.createPer("小明",45));
    }
}

猜你喜欢

转载自blog.csdn.net/qq_40933663/article/details/87922255