介绍以下几种语言特性:

Java5的特性

1.静态引用

2.可变参数

3.自动装箱和拆箱  包装类的缓存设计

4.枚举

一、静态引用(语法糖,不推荐使用,了解一下即可)

先看看普通的引用,就是import

  1. package com.StadyJava.day22;
  2.  
  3. import java.util.Collections;
  4.  
  5. public class LoadResourceDemo {
  6. public static void main(String[] args) throws Exception{
  7. Collections.emptyList();
  8. Collections.emptyList();
  9. Collections.emptyList();
  10. Collections.emptyList();
  11. }
  12.  
  13. }

我打Collections.emptyList(); Idea编译器会自动的帮我引用 java.util.Collections

可以看到,我使用了4次emptyList()方法,那么假如我下面还要使用emptyList()很多次,我每次都要写Collections,感觉很麻烦,所以静态引用就出来了,看代码

  1. package com.StadyJava.day22;
  2.  
  3. import static java.util.Collections.*;
  4.  
  5. public class LoadResourceDemo {
  6. public static void main(String[] args) throws Exception{
  7. emptyList();
  8. emptyList();
  9. emptyList();
  10. emptyList();
  11. }
  12.  
  13. }

现在我直接写emptyList()就可以了,当做是我自己的方法了。而且通过反编译代码发现,底层还是使用了Collections.emptyList();,所以静态引用就是一个语法糖。

而且容易混淆,也不知道这个方法到底是哪个类的,所以静态引用不要使用,了解一下得了。

二、可变参数 (就是一个语法糖)

该说的没什么说的了,全在代码和注释里面。我写了一个商品类,然后写了一个可变参数类,看看吧

商品类,这里面字段是自己写的,构造器和属性都是使用Generate自己生成的:

  1. package com.StadyJava.day24;
  2.  
  3. public class GoodsDemo {
  4. //商品名称,价格和数量
  5. private String name;
  6. private Integer price;
  7. private Integer number;
  8.  
  9. public String getName() {
  10. return name;
  11. }
  12.  
  13. public void setName(String name) {
  14. this.name = name;
  15. }
  16.  
  17. public Integer getPrice() {
  18. return price;
  19. }
  20.  
  21. public void setPrice(Integer price) {
  22. this.price = price;
  23. }
  24.  
  25. public Integer getNumber() {
  26. return number;
  27. }
  28.  
  29. public void setNumber(Integer number) {
  30. this.number = number;
  31. }
  32.  
  33. public GoodsDemo() {
  34. }
  35.  
  36. public GoodsDemo(String name, Integer price, Integer number) {
  37. this.name = name;
  38. this.price = price;
  39. this.number = number;
  40. }
  41.  
  42. }

可变参数类:

  1. package com.StadyJava.day24;
  2.  
  3. public class VarArgsDemo {
  4.  
  5. public static void main(String[] args) {
  6. GoodsDemo goodsDemo1=new GoodsDemo("许嵩的专辑",50,1000);
  7. GoodsDemo goodsDemo2=new GoodsDemo("林俊杰的专辑",20,1000);
  8. GoodsDemo goodsDemo3=new GoodsDemo("蜀云泉的专辑",1,1);
  9.  
  10. //调用可恶的方法1
  11. System.out.println(sum1(goodsDemo1,goodsDemo2,goodsDemo3));
  12. //方法2,创建一个数组来
  13. GoodsDemo [] goodsDemos={goodsDemo1,goodsDemo2,goodsDemo3};
  14. System.out.println(sum2(goodsDemos));
  15. //方法3,试试语法糖好吃不
  16. System.out.println(sum3(goodsDemo1,goodsDemo2,goodsDemo3));
  17.  
  18. }
  19.  
  20. //我们设计一个方法,求买的东西的价格总和。如果没有可变参数,我们会怎么办?
  21. //方法1,写死参数
  22. private static Integer sum1(GoodsDemo arg1,GoodsDemo arg2,GoodsDemo arg3){
  23. return arg1.getPrice()*arg1.getNumber()+arg2.getPrice()*arg2.getNumber()+arg3.getPrice()*arg3.getNumber();
  24. }
  25.  
  26. //方法2,创建一个数组,来存放参数
  27. private static Integer sum2(GoodsDemo[] arg){
  28. Integer msg=0;
  29. for (GoodsDemo good:arg) {
  30. msg += good.getPrice() * good.getNumber();
  31. }
  32. return msg;
  33. }
  34.  
  35. //方法3,使用可变参数的方式,其实可变参数的方式,底层还是数组。说白了就是一个语法糖而已。使用方法就是...
  36. //注意!!!使用可变参数的方式时,如果有其它的参数,一定要把可变参数放在最后!一定要把可变参数放在最后!!!
  37. private static Integer sum3(GoodsDemo ... arg){
  38. Integer msg=0;
  39. for (GoodsDemo good:arg) {
  40. msg+=good.getPrice()*good.getNumber();
  41. }
  42. return msg;
  43. }
  44.  
  45. }

三、自动装箱和拆箱  包装类的缓存设计

自动装箱和拆箱我不想讲,还是语法糖。只不过不需要你自己去转换类型了。讲讲包装类的缓存设计。

包装类的缓存设计:

Byte,short,Integer,Long.缓存范围:[-128,127]

Charactor: 缓存范围:[0,127]

在这个范围之内的可以直接拿来使用的,看个代码:

  1. public static void main(String[] args) throws Exception{
  2. //new出来的内存地址都不一样,所以比较的时候一定是false
  3. Integer num1=new Integer(17);
  4. Integer num2=new Integer(17);
  5. System.out.println(num1==num2);
  6. //Valueof的底层,-128到127之间是缓存中读取,范围之外的new
  7. Integer num3=Integer.valueOf(17);
  8. Integer num4=Integer.valueOf(17);
  9. System.out.println(num3==num4);
  10. //-128到127之间都是true,之外都是false,这个和上面的差不多
  11. Integer num5=17;
  12. Integer num6=17;
  13. System.out.println(num5==num6);
  14. //上面的比较都用==,这里用equals方法,本质就是intValue
  15. Integer num7=200;
  16. Integer num8=200;
  17. System.out.println(num7.equals(num8));
  18. //System.out.println(num7.intValue()==num8.intValue());
  19.  
  20. }

给你们看看Valueof的底层

  1. public static Integer valueOf(int i) {
  2. if (i >= IntegerCache.low && i <= IntegerCache.high)
  3. return IntegerCache.cache[i + (-IntegerCache.low)];
  4. return new Integer(i);
  5. }

就是缓存。

四、枚举(语法糖)

讲枚举之前,我们先来看看一个代码例子,一周有7天,我现在要让一个员工输入休息的是哪一天,输出一些内容,用到了3个类,看看

员工类:

  1. package com.StadyJava.day24;
  2.  
  3. public class Employee {
  4. private WeekDay restDay;
  5.  
  6. public WeekDay getRestDay() {
  7. return restDay;
  8. }
  9.  
  10. public void setRestDay(WeekDay restDay) {
  11. this.restDay = restDay;
  12. }
  13.  
  14. }

员工类就一个周类型的字段和构造

周类:

  1. package com.StadyJava.day24;
  2.  
  3. public class WeekDay {
  4.  
  5. //这个一周7天,写成这种数字的形式,1,2,3,...但是数字这种无法保证别人乱输,所以不要使用数字了
  6. //public Integer Mon=1;
  7.  
  8. public static final WeekDay Mon=new WeekDay();
  9. public static final WeekDay Tue=new WeekDay();
  10. public static final WeekDay Wen=new WeekDay();
  11. public static final WeekDay Thu=new WeekDay();
  12. public static final WeekDay Fri=new WeekDay();
  13. public static final WeekDay Sta=new WeekDay();
  14. public static final WeekDay Sun=new WeekDay();
  15.  
  16. //我这里设置构造函数为私有的,就不能传入new WeekDay对象了,只能调用我写好的对象
  17. private WeekDay(){}
  18.  
  19. }

这个类,我没有设置int类型的1,2,3...因为在输入的时候,别人可以乱输入数字的,我还得判断。直接设置成这个

调用台:

  1. package com.StadyJava.day24;
  2.  
  3. public class EnumDemo {
  4. public static void main(String[] args) {
  5. Employee e =new Employee();
  6. //由于这里可以传入new WeekDay()的空对象,所以我把构造函数设置为私有的了
  7. e.setRestDay(WeekDay.Mon);
  8.  
  9. if (e.getRestDay() == WeekDay.Sta||e.getRestDay()==WeekDay.Sun) {
  10. System.out.println("周末休息");
  11. }
  12. else {
  13. System.out.println("周一至周五休息");
  14. }
  15.  
  16. }
  17. }

这就是我的调用台代码

这样就可以实现,员工输入自己哪一天休息的,然后输入一些内容。

讲真,WeekDay这个类写起来还是稍微耗时间的,所以有了枚举,我们看看枚举是怎么写的

  1. package com.StadyJava.day24;
  2.  
  3. public enum WeekDay {
  4. Mon,Tue,Wen, Thu,Fri, Sta,Sun;
  5. }

完事...枚举就是为了解决这个问题而存在的,所以枚举适用的场景就是固定的个数的时候。

枚举底层的代码,经过反编译之后,和 public static final WeekDay Mon=new WeekDay();  是一样滴,所以枚举也是一个语法糖。

Java 语言特性的更多相关文章

  1. java语言特性概述

    一.前言 我们都知道java是面向对象的编程,其中四个基本特性:抽象.封装.继承.多态.这四个特性,概括起来可以这么理解,抽象.封装.继承是多态的基础,多态是抽象.封装.继承的表现. 二. JAVA ...

  2. [原]Java修炼 之 基础篇(一)Java语言特性

    学习软件开发,首先要选择的就是选择需要采用的编程语言,考虑语言本身的优缺点和实际需求,综合评价之后选择相关的语言进行系统开发.本篇博客开始就从近年来比较流行的Java开始为大家讲起. 背景 1995年 ...

  3. Java语言特性

    Java的语言特性: 1.语法相对简单 2.面向对象 3.分布性 4.可移植性 5.安全性 6.健壮性 7.解释性 8.多线程 9.动态性与并发性 Java中的面向对象编程: 面向对象程序设计(Obj ...

  4. Java语言特性、加载与执行

    [开源.免费.纯面向对象.跨平台] 简单性: 相对而言,例如,Java是不支持多继承的,C++是支持多继承的,多继承比较复杂:C++ 有指针,Java屏蔽了指针的概念.所以相对来说Java是简单的. ...

  5. 【Java语言特性学习之三】Java4种对象引用

    为了更灵活的控制对象的生命周期,在JDK1.2之后,引用被划分为(引用的级别和强度由高到低)强引用.软引用.弱引用.虚引用四种类型,每种类型有不同的生命周期,它们不同的地方就在于垃圾回收器对待它们会使 ...

  6. 【Java语言特性学习之一】设计模式

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  7. Java 语言特性之 Annotation 注解

    利用 Java 的反射机制,可以在运行时获取 Java 类的注解信息. 注解 注解的特性 注解是 Java 5 的一个新特性,是插入代码中的一种注释或者说是元数据.注解并不是程序代码,可以对程序作出解 ...

  8. java语言特性之一

    package java.util.Collections; public static int indexOfSubList(List<?> source, List<?> ...

  9. 【Java语言特性学习之六】扩展知识点

    一.SPI机制 二.注解处理机制 三.java native关键字 https://www.cnblogs.com/KingIceMou/p/7239668.html

随机推荐

  1. Treasure Hunting HDU - 3468

    题意: 输入一个n行m列的图 每次按字母顺序走最短路, 从一个字母走到下一个字母的过程中,只能拿走一个金子,求走完当前图中所有的字母后能拿到的金子的最大值 解析: bfs求最短路 对于一个金子如果 d ...

  2. bzoj 2054: 疯狂的馒头(线段树||并查集)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2054 线段树写法: 点的颜色只取决于最后一次染的颜色,所以我们可以倒着维护,如果当前区间之前 ...

  3. zabbix 自定义 windows 监控项

    zabbix获取windows服务器上数据C:\zabbix_agents\conf\zabbix_agentd.win.confUserParameter=conncount,d:\\tools\\ ...

  4. JVM垃圾收集(Java Garbage Collection / Java GC)

    JVM垃圾收集(Java Garbage Collection / Java GC) Java7 Java8 JDK1.8之后将最初的永久代取消了,由元空间取代. 堆内存调优简介 public sta ...

  5. expect交互式安装软件

    公司一些宿主机需要安装软件,吴老师要求写一个安装脚本: 脚本思路:首先要把安装的包拷贝到每台机器上,然后要让每台机器都运行一次安装命令:就想到了应用scp.ssh命令,但这两个命令需要输入对端密码,需 ...

  6. Spring点滴五:Spring中的后置处理器BeanPostProcessor讲解

    BeanPostProcessor接口作用: 如果我们想在Spring容器中完成bean实例化.配置以及其他初始化方法前后要添加一些自己逻辑处理.我们需要定义一个或多个BeanPostProcesso ...

  7. 【BZOJ5336】[TJOI2018]party(动态规划)

    [BZOJ5336][TJOI2018]party(动态规划) 题面 BZOJ 洛谷 题解 这题好神仙啊... 考虑普通的\(LCS\)的\(dp\),\(f[i][j]=\max\{f[i-1][j ...

  8. Luogu P4774 / LOJ2721 【[NOI2018]屠龙勇士】

    真是个简单坑题...++ 前置: exgcd,exCRT,STL-multiset 读完题不难发现,攻击每条龙用的剑都是可以确定的,可以用multiset求.攻击最少显然应该对于每一条龙都操作一次,即 ...

  9. [luogu3391][bzoj3223]文艺平衡树【splay】

    题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 分析 ...

  10. emwin之小键盘制作

    @2019-01-29 [小记] 小键盘的BUTTON控件由WINDOW控件组织,只需将所用BUTTON控件禁止聚焦即可. 小键盘的BUTTON控件由FRAMEWIN控件组织,将所用BUTTON控件禁 ...