iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >JAVA语法糖原理你知道吗
  • 396
分享到

JAVA语法糖原理你知道吗

2024-04-02 19:04:59 396人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录Java语法糖1.基本概念1.1语法糖1.2解语法糖2.常见糖块2.1 switch 支持 String 与枚举2.2泛型2.3自动装箱与拆箱2.4方法变长参数2.5枚举2.6条

Java语法糖

​ 几乎所有的编程语言都或多或少提供过一些语法糖来方便程序员的代码开发,这些语法糖虽然不会提供实质性的功能改进,但是它们或能提高效率,或能提升语法的严谨性,或能减少编码出错的机会。

1.基本概念

1.1语法糖

​ 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。简而言之,语法糖让程序更加简洁,有更高的可读性。

1.2解语法糖

解语法糖

​前面提到过,语法糖的存在主要是方便开发人员使用。但其实,Java虚拟机并不支持这些语法糖。这些语法糖在编译阶段就会被还原成简单的基础语法结构,这个过程就是解语法糖。Java语言中,javac命令可以将后缀名为.java的源文件编译为后缀名为.class的可以运行于Java虚拟机的字节码。

​ 如果你去看com.sun.tools.javac.main.JavaCompiler的源码,你会发现在compile()中有一个步骤就是调用desugar(),这个方法就是负责解语法糖的实现的。

~~此处需要javac的源码

2.常见糖块

2.1 switch 支持 String 与枚举

​ 都知道,Java中的swith自身原本就支持基本类型。比如int、char等。对于int类型,直接进行数值的比较。对于char类型则是比较其ascii码。所以,对于编译器来说,switch中其实只能使用整型,任何类型的比较都要转换成整型。比如byte。short,char(ackii码是整型)以及int。

演示代码:


public static void main(String[] args) {

    }
//    @Test
    public void Test1(){
//        Scanner scanner=new Scanner(System.in);
//        String next = scanner.next();
        String next="小高";
        switch (next){
            case "小高":
                System.out.println("我是小高");
                break;
            case "大高":
                System.out.println("我最美");
                break;
        }
    }

解释:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WimrXrjl-1630397914057)(C:\Users\CoolGuy\AppData\Roaming\Typora\typora-user-images\image-20210831135124051.png)]

2.2泛型

​ 通常情况下,一个编译器处理泛型有两种方式:Code specialization和Code sharing。c++C#是使用Code specialization的处理机制,而Java使用的是Code sharing的机制。

2.3自动装箱与拆箱

​ 自动装箱就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱。因为这里的装箱和拆箱是自动进行的非人为转换,所以就称作为自动装箱和拆箱。

在这里插入图片描述

演示代码:


public static void main(String[] args) {
        Integer a=1;//自动装箱
        int b=a;//自动拆箱
    }

解析:

在这里插入图片描述

可以看到,自动拆箱与装箱分别封装了Integer中的intValue()与valueOf()方法。

2.4方法变长参数

​ 可变参数(variable arguments)是在Java 1.5中引入的一个特性。它允许一个方法把任意数量的值作为参数。常见的就是printf()方法。


 public static void main(String[] args)
    {
        print("高冷", "公众号:高冷小伙", "博客:高冷小伙");
    }

    public static void print(String... strs)
    {
        for (int i = 0; i < strs.length; i++)
        {
            System.out.println(strs[i]);
        }
    }

从反编译后代码可以看出,可变参数在被使用的时候,他首先会创建一个数组,数组的长度就是调用该方法是传递的实参的个数,然后再把参数值全部放到这个数组当中,然后再把这个数组作为参数传递到被调用的方法中。

**注:**String…是java5新加入的功能,表示的是一个可变长度的参数列表。

2.5枚举

​ Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。例如定义一个颜色的枚举类。

演示代码:


public enum t { 
    spring,SUMMER; 
} 

反编译后的代码:


public final class T extends Enum 
{ 
    private T(String s, int i) 
    { 
        super(s, i); 
    } 
    public static T[] values() 
    { 
        T at[]; 
        int i; 
        T at1[]; 
        System.arraycopy(at = ENUM$VALUES, 0, at1 = new T[i = at.length], 0, i); 
        return at1; 
    } 
 
    public static T valueOf(String s) 
    { 
        return (T)Enum.valueOf(demo/T, s); 
    } 
 
    public static final T SPRING; 
    public static final T SUMMER; 
    private static final T ENUM$VALUES[]; 
    static 
    { 
        SPRING = new T("SPRING", 0); 
        SUMMER = new T("SUMMER", 1); 
        ENUM$VALUES = (new T[] { 
            SPRING, SUMMER 
        }); 
    } 
} 

通过反编译后代码我们可以看到,public final class T extends Enum,说明,该类是继承了Enum类的,同时final关键字告诉我们,这个类也是不能被继承的。

当我们使用enmu来定义一个枚举类型的时候,编译器会自动帮我们创建一个final类型的类继承Enum类,所以枚举类型不能被继承。

2.6条件编译

​ Java语法的条件编译,是通过判断条件为常量的if语句实现的。根据if判断条件的真假,编译器直接把分支为false的代码块消除。通过该方式实现的条件编译,必须在方法体内实现,而无法在正整个Java类的结构或者类的属性上进行条件编译。

2.7 for : each循环

for:each循环比for循环的代码量要少很多,但实际上就是使用了For循环和迭代器。

演示代码:


 public static void main(String[] args) {
        String[] strs={"高效","高冷","高超","高速"};
        for(String str:strs){
            System.out.println(str);
        }
    }

解析:


public static void main(String[] args) {
    String[] strs = new String[]{"高效", "高冷", "高超", "高速"};
    String[] var2 = strs;
    int var3 = strs.length;

    for(int var4 = 0; var4 < var3; ++var4) {
        String str = var2[var4];
        System.out.println(str);
    }

}

3.最后

3.1Java编译与反编译


java cp D:\JVM_Study\src\SyntacticSugar\SwitchDemo.java
参数是cp,路径是.java文件的路径
    
javap -c D:\JVM_Study\out\production\JVM_Study\SyntacticSugar\SwitchDemo.class
参数是c
路径是的.class文件路径
3.1Java编译与反编译

~~~java
java cp D:\JVM_Study\src\SyntacticSugar\SwitchDemo.java
参数是cp,路径是.java文件的路径
    
javap -c D:\JVM_Study\out\production\JVM_Study\SyntacticSugar\SwitchDemo.class
参数是c
路径是的.class文件路径

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: JAVA语法糖原理你知道吗

本文链接: https://www.lsjlt.com/news/134212.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JAVA语法糖原理你知道吗
    目录Java语法糖1.基本概念1.1语法糖1.2解语法糖2.常见糖块2.1 switch 支持 String 与枚举2.2泛型2.3自动装箱与拆箱2.4方法变长参数2.5枚举2.6条...
    99+
    2024-04-02
  • Python绘图示例程序中的几个语法糖果你知道吗
    目录01 示例函数1.1 代码及结果1.2 Python函数02 数组索引2.1 省略号2.2 扩增数组维度2.3 元组相加2.4 一维变二维总结01 ...
    99+
    2024-04-02
  • javascriptes6的常用语法你知道吗
    目录1.const常量标识1.不允许重复声明赋值2.块级作用域3.无变量提升4.dead zone (死区)5.let or cosnt总结1.不允许重复声明赋值2.块级作用域3.无...
    99+
    2024-04-02
  • Python强大的语法支持你知道吗
    目录1 Python便捷的数学运算1.1 整数计算1.2 浮点数计算1.3 复数计算1.4 内置数学函数2 简单的字符串处理2.1 字符串标识2.2 字符串长度2.3 字符串的简单拼...
    99+
    2024-04-02
  • Java Springboot的目的你知道吗
    目录Spring-boot目的Spring如何简化开发第一个spring-boot程序总结Spring-boot目的 Spring是为了解决企业应用开发的复杂性而创建的,简化开发 S...
    99+
    2024-04-02
  • Java自然语言处理中的同步函数,你知道吗?
    随着人工智能技术的发展,自然语言处理(NLP)已经成为了人工智能领域中的一个重要方向。在NLP中,同步函数是一个十分重要的概念。本文将介绍Java自然语言处理中的同步函数,并演示如何在Java中使用同步函数进行自然语言处理。 什么是同步函...
    99+
    2023-10-29
    自然语言处理 同步 函数
  • JavaScript的原型是什么你知道吗
    目录先看三个对象一、构造函数(对象): 二、实例对象三、原型对象:再看三个属性:一、prototype:二、__proto__三、constructor属性原型链总结:先看...
    99+
    2024-04-02
  • JavaSpring的refresh方法你知道吗
    目录spring的refresh方法前置知识创建 Bean 容器前的准备工作创建 Bean 容器,加载并注册 Bean总结spring的refresh方法 前置知识 方法入口 // ...
    99+
    2024-04-02
  • 你知道吗?Java对象文件响应的工作原理是什么?
    Java是一种广泛使用的编程语言,它的对象文件响应机制是Java程序的重要组成部分。本文将深入探讨Java对象文件响应的工作原理,并提供演示代码,让读者对此有更深入的了解。 首先,让我们来了解一下Java中的对象文件。在Java中,对象文件...
    99+
    2023-09-10
    对象 文件 响应
  • 你知道吗?使用索引优化你的自然语言处理算法
    当我们需要对文本进行处理时,自然语言处理算法是必不可少的工具。然而,在处理大量文本时,算法的效率往往会成为瓶颈。这时,我们可以使用索引来优化算法,提高其效率。 什么是索引? 索引是一种数据结构,用于快速查找数据。在自然语言处理中,我们可以将...
    99+
    2023-08-26
    django 自然语言处理 索引
  • 你知道Java数组在Django中如何处理吗?
    Java数组在Django中的处理方式 Java和Django都是非常流行的编程语言和框架,它们都有着广泛的应用和强大的功能。但是,在Java中使用数组和在Django中使用数组是不同的,因为它们在处理方式上有所差异。在本文中,我们将深入探...
    99+
    2023-10-03
    数组 linux django
  • 你知道吗?Go语言如何帮助你处理大数据?
    Go语言作为一门开源的编程语言,近年来在数据处理领域逐渐崭露头角。与其他语言相比,Go语言具有高效、并发、简洁等优点,因此在处理大数据方面表现出色。本文将详细介绍Go语言在大数据处理方面的应用。 一、Go语言的高效性 在数据处理中,高效性是...
    99+
    2023-06-14
    spring numpy 大数据
  • 你知道Java编程中最常用的算法吗?
    Java是一种广泛使用的编程语言,由于其灵活性和可扩展性,在各种应用程序中都得到了广泛的应用。在Java编程中,算法是一个重要的主题,因为它们是解决各种问题的核心方法。在本文中,我们将探讨Java编程中最常用的算法,并提供演示代码。 冒泡...
    99+
    2023-09-25
    编程算法 django laravel
  • Java Spring的两种事务你知道吗
    目录1.Spring中的事务控制方式2.编程式事务控制相关对象2.1PlatformTransactionManager2.2TransactionDefinition2.3Tran...
    99+
    2024-04-02
  • 你知道如何使用 Go 语言处理数组吗?
    Go 语言是一种现代化的编程语言,它的设计目标是提高代码的可读性、可维护性和可靠性。Go 语言提供了丰富的数据类型和数据结构,其中数组是一种基本的数据结构。本文将介绍如何使用 Go 语言处理数组。 声明和初始化数组 声明一个数组需要指定...
    99+
    2023-10-07
    数组 git 日志
  • 你知道Java的这些骚操作吗?
    目录一、try with catch二、instance of三、不定项参数 ...四、跳出多层循环的label五、方法引用总结一、try with catch 还记得这样的代码吗?...
    99+
    2024-04-02
  • Java的springcloud Sentinel是什么你知道吗
    目录Sentinel 是什么?概述Sentinel 的历史:历史Sentinel 分为两个部分:两部分基本概念及作用基本概念:主要作用:Sleuth概述zipkin分布式监控客户端基...
    99+
    2024-04-02
  • Java ThreadLocal有什么作用你知道吗
    目录ThreadLocal有什么作用测试代码当前线程只能操作当前ThreadLocal定义的局部变量,其他线程是访问不了。测试结果总结ThreadLocal有什么作用 ThreadL...
    99+
    2024-04-02
  • Java语言中finally是否一定会执行你知道吗
    目录简介finally 代码块不会运行的情况情况一:代码流程并未进入try语句块情况二: 使用了 System.exit(int) 退出程序情况三:程序所在的线程死亡情况四:其它非正...
    99+
    2024-04-02
  • 你知道Java如何处理实时的Numpy对象吗?
    Java作为一种高效、稳定的编程语言,已经成为了许多企业级应用的首选。与此同时,Numpy作为Python中的一个重要库,也被广泛用于科学计算、数据分析等领域。那么,当Java需要处理实时的Numpy对象时,我们该怎样去做呢?本文将为大家详...
    99+
    2023-10-15
    实时 numpy 对象
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作