JAVA---注解、jdk1.8新特性

一、重点知识

注解并无主动功能,主要功能就是给类和类的组成做标记,让编译器检查

RetentionPolicy.CLASS是默认生命周期,没有被@Retention修饰的注解的生命周期都是这种策略。
接口中default方法只能让实现类用

static 定义的方法只能给接口用

接口中只有一个抽象方法时,才可以用lambda表达式简写,这样的接口我们称为函数式接口

只有有提示的时候编译器才能给lambda表达式补全

函数接口实现匿名内部类的简写形式就是lambda表达式

lambda表达式不能调用接口中的默认方法

异常最重要的是名称,处理都以异常名为准

二、重点问题

注解部分重点内容:

1、什么是注解,注解的作用

2、如何自定义一个注解

3、三种重要的元注解

@target规定了注解的使用位置 @retention 规定注解的生命周期 @Repeatable 定义重复注解

4、注解在实际中如何通过反射调用

三课堂知识

注解

  1. 定义:
    • 注解就是给代码中的某个成员做一个标记
    • 至于能不能发挥作用,主要看检测这个标记的功能
  2. 自定义注解
    • 写一个类, @interface
    • 元注解 : 用来给标记注解
      • @Target : 当前定义的注解以后可以使用在什么位置
      • @Retention : 当前注解保留到什么时候

一. default关键字

  1. 定义

    • 1.8中允许我们给接口添加一个非抽象的方法实现, 在方法使用default关键字就可以了,这个特征又叫做拓展方法
  2. 演示

    public interface MyInterface {
     //使用default的关键字
     public default void method(){
         System.out.println("你好....");
     }
    }
    
  3. 注意事项

    • 我们都知道, java之所以支持多实现就是应为接口中没有具体的逻辑代码, 不会造成冲突的问题, 那么1.8之后我们可以在接口中编写具体的逻辑代码了,那么多实现的时候会冲突吗 ?
    • 肯定会冲突的,所以为了解决这个问题, 编译器要求如果多实现的时候出现了相同名称的非抽象方法的话,子类就必须重写这个方法
  4. 多实现

    public class Demo implements MyInterface,MyInterface2{
    
     @Override
     public void method() {
         System.out.println("子类必须重写多个接口中相同名称的非抽象方法");
            MyInterface.super.method();
     }
    
    }
    

二. 接口中的静态方法

  1. 定义

    • 在接口中定义一个静态的方法, 可以有具体的代码实现
  2. 演示

    public interface MyInterface {
     
     //静态方法 只能接口自己使用
     //接口中的静态方法权限必须是public的, 默认加上public
     static void method3(){
         System.out.println("我是接口中的静态方法");
     }
    }
    
  3. 注意事项

    • 子类无法使用接口中的静态方法
    • 接口中的静态方法的权限必须是公共的,可以不写,默认是公共的

三. lambda表达式

  1. 定义

    • 一种简写形式,格式精简, 很酷
    • 每一个lambda的表达都对应一个类型,通常是接口类型的
    • 适用于函数式接口(只有一个抽象方法的接口)
  2. 格式

    • (参数...) -> {执行代码} 返回一个可用的对象
    • 当只有一句代码时,大括号可以省略, 不建议省略
  3. 演示

    public static void main(String[] args) {
     List<String> list = Arrays.asList("hh","dd","ni","kk");
     
     //之前的写法
     Collections.sort(list,new Comparator<String>() {
         public int compare(String o1, String o2) {
             
             return o1.compareTo(o2);
         }
     });
     
     //lambda表达式的写法
     Collections.sort(list, (String a,String b)->{
         return a.compareTo(b);
     });
     
     System.out.println(list);
    
    }
    
  4. 方法的引用

    • 使用 : : 来引用一个类的方法
    public interface Doing<K,T> {
     
     public T doing(K k);
    }
    
    
    public static void main(String[] args) {
     //调用类中的静态方法来处理接口中方法上的参数
     Doing<String, Integer> d = Integer::valueOf;
     Integer integer = d.doing("123");
     System.out.println(integer);
    }
    
    public static void main(String[] args) {
     //调用对象的方法
     Doing<String, Integer> d = "java"::lastIndexOf;
     Integer i = d.doing("v");
     System.out.println(i);
    }
    
  5. 构造方法的引用

    • 用new关键字来代替构造方法
    public class Person {
     String name;
    
      Person(String name) {
         super();
         this.name = name;
     }
    
     @Override
     public String toString() {
         return "Person [name=" + name + "]";
     }
    
    }
    
    public static void main(String[] args) {
     //引用对象的构造方法
     Doing<String, Person> d = Person::new;
     Person person = d.doing("小明");
     
     System.out.println(person);
    }
    
  6. 注意事项

    • lambda表达式指向的接口必须和调用的方法的参数一致,也就是说相当于是接口实现类中的方法调用你指向的方法
    • lambda表达式中访问外层作用域和老版本的匿名对象的方式很相似, 你可以直接访问标记了final的外层局部变量, 或者示例的字段以及静态变量
    • lambda表达式中无法访问接口中的默认方法(就是被default修饰的方法)

四. Stream接口

  1. 定义

    • 表示能应用在一组元素上一次执行的操作序列
    • 其实就是找了一个地方将执行了某个方法后剩下的元素存放起来
    • 提供了许多操作集合的方法,而且原集合数据不受影响
  2. 常用的方法

    • filter 过滤
    • sorted 排序
    • map 转化
    • match 匹配
    • count 计数
  3. 演示

    public static void main(String[] args) {
     List<String> stringCollection = new ArrayList<>();
     stringCollection.add("ddd2");
     stringCollection.add("aaa2");
     stringCollection.add("bbb1");
     stringCollection.add("aaa1");
     stringCollection.add("bbb3");
     stringCollection.add("ccc");
     stringCollection.add("bbb2");
     stringCollection.add("ddd1");
     
     //过滤出以a开头的元素并遍历
     stringCollection.stream().
     filter((s)->s.startsWith("a"))
     .forEach(System.out::println);;
    }
    
  4. 并行

    • 并行Stream可以在多个线程上同时执行
    public static void main(String[] args) {
     int max = 1000000;
     List<String> values = new ArrayList<>(max);
     for (int i = 0; i < max; i++) {
         //创建随机id
         UUID uuid = UUID.randomUUID();
         values.add(uuid.toString());
     }
     
     long t1 = System.nanoTime();
     //获取并行的stream
     long count = values.parallelStream().sorted().count();
     System.out.println(count);
     
     long t2 = System.nanoTime();
     System.out.println(t2-t1);
    }
    

五. Date

  1. 定义

    • java 8 在包java.time下包含了一组全新的时间日期API
  2. ZoneId

    • 定义时区
    public static void main(String[] args) {
     System.out.println(ZoneId.getAvailableZoneIds());
     //获取某个城市的时区
     ZoneId zone1 = ZoneId.of("Europe/Berlin");
     ZoneId zone2 = ZoneId.of("Asia/Shanghai");
     System.out.println(zone1.getRules());
     System.out.println(zone2.getRules());
    }
    
  3. LocalTime

    • 一个没有时区信息的时间,以设置的时区为准备
    public static void main(String[] args) {
     //获取所有的时区信息
     System.out.println(ZoneId.getAvailableZoneIds());
     //获取某个城市的时区
     ZoneId zone1 = ZoneId.of("Europe/Berlin");
     ZoneId zone2 = ZoneId.of("Asia/Shanghai");
     
     LocalTime now1 = LocalTime.now(zone1);
     LocalTime now2 = LocalTime.now(zone2);
     //判断时间1以是否在时间2之前
     System.out.println(now1.isBefore(now2));  // true
     //使用ChronoUnit计算两个时间差值 
     long hoursBetween = ChronoUnit.HOURS.between(now1, now2);
     long minutesBetween = ChronoUnit.MINUTES.between(now1, now2);
     System.out.println(hoursBetween);
     System.out.println(minutesBetween);
    }
    

六.其他新特性

  1. 重复注解
  2. 可以将参数的名字保留到字节码中
  3. Nashorn引擎 : jjs , 可以执行js代码
  4. 移除了FermGen空间,用Metaspace代替
    • -XX:MetaSpaceSize与-XX:MaxMetaspaceSize被代替-XX:PermSize与-XX:MaxPermSize
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355