java学习——语法糖

语法糖是啥?

语法糖是对现有的语法进行一个封装,提高程序的可读性,提高开发效率。人话就是,一些好理解的语法,一些新java版本的新玩意。

第一节:语法糖和环境设置

1、语法糖

syntactic sugar:使得程序员能够更简单的编写程序,更清晰准确地表达业务逻辑。简单来说,语法糖是对现有的语法进行一个封装,提高程序的可读性,提高开发效率。

2、编译环境设置

2.1 基础知识

JRE(Java Runtime Enviroment)是java的运行环境。面向Java程序的使用者,而不是开发者。如果你仅下载并安装了JRE,那么你的系统只能运行Java程序。JRE是运行Java程序所必须环境的集合,包含JVM标准实现及 Java核心类库。它包括Java虚拟机、Java平台核心类和支持文件。它不包含开发工具(编译器、调试器等)。

JDK(Java Development Kit)又称J2SDK(Java2 Software Development Kit),是Java开发工具包,它提供了Java的开发环境(提供了编译器javac等工具,用于将java文件编译为class文件)和运行环境(提 供了JVM和Runtime辅助包,用于解析class文件使其得到运行)。如果你下载并安装了JDK,那么你不仅可以开发Java程序,也同时拥有了运 行Java程序的平台。JDK是整个Java的核心,包括了Java运行环境(JRE),一堆Java工具tools.jar和Java标准类库 (rt.jar)。

如何理解JDK与JRE和java之间的关系呢?看这个链接。又该怎么理解java版本之间的关系呢?看下面这张图吧。吐槽一下,命名可乱了,总结一下就是只要看后面的数字就好了。

img
  • JDK2(1.1~1.4)是普及版
  • JDK5/6/7/8/11 是长期稳定版
  • JDK 9/10/12是短期稳定版

2.2 给项目设定不同的JDK版本

1、设定不同JDK产出java.class

  • java项目:右键项目,javaBuildPath中Library中设置
  • maven项目:添加如下maven依赖。
image-20210527091238924

2、设定不同的JDK来运行你的程序。

设定项目的编译级别:将来java要运行的时候的JDK的版本,JDK是向后兼容的。比他高的版本都可以运行。

image-20210527091516813

eclipse可以设置很多个不同版本的JDK,并设置相应的编译级别。

如果新项目导入之后出现不兼容问题,会出现红色感叹号,建议参考这篇文章

第二节 for-each和枚举

1、for-each循环

  • 从JDK5.0开始引入
  • 语法简洁,可以避免越界错误
  • 不可以删除/替换元素(for循环可以)
  • 遍历元素的时候不知道当前元素具体位置索引
  • 只能正向遍历,不能反向遍历
  • 不能同时遍历两个集合
  • for和for-each性能接近。

2、枚举类型

枚举变量:变量的取值只在一个有限的集合内。

  • java5 推出枚举类型
  • 通过enum关键字声明枚举类,虽然都是Enum的子类,但是不需要写extends
  • enum内部有多少值就有且只有多少实例对象
  • 不能直接new枚举对象

image-20210527100830890

这个例子说明的是,s1和s2指向的是同一个对象,而且enum定义时不需要加extends,使用时不需要new。

  • 除了枚举内容,还可以添加属性/构造函数/方法
  • 构造函数只能是package-private(default)或者private,内部调用
public class HHH {
	public static void main(String[] args) {
	Fruit a1 = Fruit.APPLE;
	System.out.println("Price is "+a1.getPrice());
	}
}

enum Fruit{
	APPLE(10),ORANGE(8);
	private int price;
    
	Fruit(int price){
		this.price = price;
	}
	public int getPrice() {
		return this.price;
	}
}

构造方法只能内部调用,意思是APPLE(10)就是给APPLE对象的price赋值为10,然后通过getPrice可以获取到这个值,这个还挺有意思的,相当于一个enum属性可以存储多个值???

Java的enum类型中的方法

  • oridinal()返回枚举值所在的索引位置,从0开始。
  • compareTo()比较两个枚举值的索引位置大小
  • toString()返回枚举值的字符串表示
  • valueOf()将字符串初始化为枚举对象
  • values()返回所有的枚举值
public class DayTest {
	public static void main(String[] args) {
		Day d1 = Day.MONDAY;
		Day d2 = Enum.valueOf(Day.class, "MONDAY");
		System.out.println(d1 == d2);    //true
		
		Day d3 = Enum.valueOf(Day.class, "TUESDAY");
		System.out.println(d1.compareTo(d3)); //MONDAY<TUESDAY
		
		//遍历所有枚举值ֵ
		for(Day item : Day.values())
		{
			System.out.println(item.toString() + "," + item.ordinal());
		}		
	}
}
enum Day
{
	MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}

具体需要看的是:怎么由字符串转为枚举,枚举类型是有索引的,类似于数组?

程序结果是:

image-20210527104730342

第三节 不定项参数和静态导入

1、不定参数

JDK5提供了不定项参数(可变参数)

image-20210527105321373

不定项参数的条件:

image-20210527105602661

上面的意思是啥呢?优先级规则1说的是,如果函数调用同时满足定向参数条件和不定项参数的条件,先调用定向参数的函数。优先级2说的是,如果函数调用同时满足两个不定项参数的函数定义,那就会报错。

2、静态导入

JDK5新引入的import static 类名

  • 导入一个类的静态方法和静态变量,不是导入类,而是导入类中静态的东西。

image-20210527110118243

这个方法主要是为了达到简写的功能,避免重复写类名。注意事项:

image-20210527110248958

我觉得这东西没啥用,稍微了解一下吧,都少用一点。

第四节 自动拆箱和装箱、多异常并列、数值类型赋值

1、自动拆箱和装箱

image-20210527110638317

注意,基本类型是不能存放在ArrayList中,所以只能用包装类型把他存在里面。

  • 自动装箱和拆箱是编译器的功能,虚拟机中没有自动装箱和拆箱的语句
  • ==:在基本类型时是判断内容是否相同,在对象是判断指针是否相同。
  • 基本类型没有空值,对象是有null的,拆箱是注意触发NullPointerException
  • 当一个基础数据类型与封装类进行数据运算时,会将封装类进行拆箱,对基础类型进行运算。只要有一个数值类型,整个运算都是数值类型进行
  • 谨慎使用非同类数据类型对象进行运算。
public class NumberTest {
    public static void main(String[] args) {
        Integer a1 = 1000;
        int a2 = 1000;
        Integer a3 = 2000;
        Long a4 = 2000L;
        long a5 = 2000L;

        System.out.println(a1 == a2);  //拆箱再进行数值比较         true
        System.out.println(a3 == (a1 + a2));  //拆箱再进行数值比较      true
        System.out.println(a4 == (a1 + a2));  //拆箱再进行数值比较      true
        System.out.println(a5 == (a1 + a2));  //拆箱再进行数值比较      true

        System.out.println(a3.equals(a1+a2)); //equals要求同类,且内容相同      true,自动拆箱再装箱
        System.out.println(a4.equals(a1+a2)); //equals要求同类,且内容相同      false
        System.out.println(a4.equals((long) (a1+a2))); //equals要求同类,且值相同      true
        //System.out.println(a3 == a4); //不同类型不能比较
    }
}

2、多异常并列

JDK7 开始简化多异常处理,通过管道符号进行连接,不是“或”

注意多个异常之间不能有直接或者间接的继承关系,如果有,则报错。

image-20210527112008546

3、数值类型赋值

image-20210527112124694

通过下划线增加了可读性,编译器会自动去掉下划线。但是下划线只能用在数字中间。

image-20210527112220028

第五节 接口方法

1、接口的默认方法

以前的接口方法都是没有实现,没有公开的。JDK8推出接口的默认方法(都带实现的)为lambda表达式提供支持。

image-20210527114221655

注意必须要有default关键字,这个不仅仅指的是访问权限,更是作为一个关键字进行标注,构建接口的默认方法。

image-20210527114356949

解释一下:接口的方法优先级会小于父类的代码优先级,子类不能够实现有两个同名同参数方法(至少有一个默认方法)的接口,必须重写该方法,以免歧义,重写的意思是告诉程序,到底是调用谁?

image-20210527115038408

2、接口的静态方法

image-20210527115230317

可以通过接口名.方法名来调用该方法,但是这个方法不是子类的。JDK8开始有的。

3、接口的私有方法

image-20210527115430611

image-20210527115446421

玩的花里胡哨的。

4、接口与类的新规则

image-20210527115628325

image-20210527115657181

第六节 try-with-resource和Resource Bundle文件加载

1、try-with-resource

解决的问题:

  • 访问文件,提供正确的文件关闭

image-20210527115846038

编译器自动帮你加入这个finally模块,把文件关闭掉。

image-20210527115907605

2、resourceBundle文件加载

image-20210527120111165

第七节 var类型和switch

1、var

java以前是强类型的程序语言,推出了一种局部类型推断。

image-20210527113054174

我jio得有点鸡肋哈,还不能改,这挺不方便的。

image-20210527113205109

2、Switch

image-20210527113508366

通过下面的语句,可以更加精简语句,还可以不写break语句。这是JDK12才有的新语法。

image-20210527113601869

多个语句需要用{}括起来,表示的是多个语句进行赋值。

image-20210527113739781

总结

持续记录,慢下来是为了走的更快。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值