热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java基础篇之常量、变量、运算符

数据类型Java中的数据类型包括基本数据类型和引用数据类型。下图为Java数据类型的分类:装箱(boxing)与拆箱(un

数据类型


  • Java中的数据类型包括基本数据类型引用数据类型
  • 下图为Java数据类型的分类:

在这里插入图片描述


装箱(boxing)与拆箱(unboxing)


  • Java数据类型中的8种简单类型分别为:boolean、byte、char、short、int、long、float和double,与之相对应的Java类库的java.lang包中定义了8种包装类(wrapper):Boolean、Byte、Character、Short、Integer、Long、Float、Double。
  • 通过装箱和拆箱操作,可以实现简单类型与引用类型之间的转换。
  • 装箱即将一个简单类型转换成对应的包装类型。把一个简单类型的值装箱,就是创建一个对应的包装类的实例,我们可以称之为“箱子”,并将这个值复制给这个对象,装箱后对应的包装类的实例对象存储在堆中。
  • 拆箱即将一个包装类的实例对象类型转换成一个简单类型,拆箱过程一般分成两步,首先检查这个对象实例是否为给定的值类型的装箱值,然后把这个对象实例的值复制给值类型的变量。
  • 值得注意的是,装箱和拆箱会导致额外的系统开销。
  • eg:

public class Testdome1 {public static void main(String[] args) {Integer i =1;//装箱int j =i;//拆箱System.out.println(j);}
}

反编译后得到以下内容:

G:\javacode\HelloWorld>javac src\com\k\Testdome1.javaG:\javacode\HelloWorld>javap -c src.com.k.Testdome1
警告: 二进制文件src.com.k.Testdome1包含com.k.Testdome1
Compiled from "Testdome1.java"
public class com.k.Testdome1 {public com.k.Testdome1();Code:0: aload_01: invokespecial #1 // Method java/lang/Object."":()V4: returnpublic static void main(java.lang.String[]);Code:0: iconst_11: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;4: astore5: aload_16: invokevirtual #3 // Method java/lang/Integer.intValue:()I9: istore_210: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;13: iload_214: invokevirtual #5 // Method java/io/PrintStream.println:(I)V17: return
}

从反编译得到的字节码内容可以看出,在装箱的时候自动调用的是Integer的valueOf(int)方法。而在拆箱的时候自动调用的是Integer的intValue方法的。
装箱过程是通过调用包装器的valueOf方法实现的,而拆箱过程是通过调用包装器的 xxValue方法实现的。
Tip:


  • 示例:

public class Testdome1 {public static void main(String[] args) {Integer i1 = 100;Integer i2 = 100;System.out.println(i1 == i2);System.out.println(i1.equals(i2));Integer i3 = 200;Integer i4 = 200;System.out.println(i3 == i4);System.out.println(i3.equals(i4));}
}

  • 输出结果:

true
true
false
true

  • 这里经常会出现错误,简单来说,“==”比较的是地址,“equals”比较的是指向的数值,i1和i2指向的是用一个对象,而i3和i4指向的是不同对象,此时我们查看Integer的valueof方法:
    -public static Integer valueOf(int i) {
    if(i >&#61; -128 && i <&#61; IntegerCache.high)
    return IntegerCache.cache[i &#43; 128];
    else
    return new Integer(i);
    }
  • 在通过valueOf方法创建Integer对象的时候&#xff0c;如果数值在**[-128,127]**之间&#xff0c;便返回指向IntegerCache.cache中已经存在的对象的引用&#xff1b;否则创建一个新的Integer对象。 上面的代码中i1和i2的数值为100&#xff0c;因此会直接从缓存cache中取已经存在的对象&#xff0c;所以i1和i2指向的是同一个对象&#xff0c;而i3和i4则是分别指向不同的对象&#xff0c;因为200已经不再范围内&#xff0c;会重新生成对象。

变量


  • 变量表示存储位置。每个变量必须具有一个类型。程序通过改变变量的值来改变整个程序的状态&#xff0c;或者说得更大一些&#xff0c;也就是实现程序的功能逻辑。为了方便的引用变量的值&#xff0c;在程序中需要为变量设定一个名称&#xff0c;这就是变量名。Java是一种类型安全的语言&#xff0c;Java编译器保证存储在变量中的值具有合适的类型&#xff0c;通过赋值更改变量的值。
  • 变量同时也可以分为实例变量&#xff0c;静态变量&#xff0c;以及局部变量
  • 注意&#xff1a;
    &#xff08;1&#xff09;变量在使用之前必须声明&#xff1b;
    &#xff08;2&#xff09;变量可以在声明的同时赋值&#xff0c;也可以先声明再赋值&#xff1b;
    &#xff08;3&#xff09;变量一次只能赋一个值&#xff0c;但可以修改多次&#xff1b;
    &#xff08;4&#xff09;静态变量不属于对象&#xff0c;只属于类本身&#xff0c;所以在JVM内存区域中放在方法区中&#xff1b;
    &#xff08;5&#xff09;局部变量使用时必须初始化&#xff1b;一般放在虚拟机栈中&#xff1b;
    &#xff08;6&#xff09;JVM&#xff08;Java visual machine&#xff09;内存区域分别有&#xff1a;堆&#xff08;heap&#xff09;、方法区&#xff08;method area&#xff09;、虚拟机栈&#xff08;VM stack&#xff09;、本地方法栈&#xff08;native method stack&#xff09;、程序计数器&#xff08;program counter register&#xff09;五部分&#xff1b;
    &#xff08;7&#xff09;变量定义&#xff1a;变量名称由字母、数字、下划线&#xff08;_&#xff09;、美元符&#xff08;$&#xff09;组成即标识符&#xff08;标识符是严格定义大小写的&#xff09;&#xff0c;但是不包括&#64;、%、空格等&#xff0c;但是不能以数字、美元符号、下划线开头。
  • 示例&#xff1a;int a; //实例变量&#xff1b;
    static double b;//静态变量&#xff1b;
    if&#xff08;i&#61;&#61;0&#xff09;{ int c &#61; 1; } //局部变量&#xff1b;

常量


  • 常量分类&#xff1a;数值型常量&#xff08;整形或浮点型&#xff09;、字符型常量&#xff08;以‘’引起来的单个字符&#xff09;、转义字符常量&#xff08;以‘\’开头&#xff09;、字符串常量&#xff08;以“”引起来的单个字符或多个字符&#xff09;、布尔型常量&#xff08;true和false&#xff09;、null常量&#xff08;表示空&#xff0c;并非不存在&#xff09;、用户声明常量。
  • 注意&#xff1a;
    &#xff08;1&#xff09;常量名一般大写&#xff1b;
    &#xff08;2&#xff09;第一次初始化赋值后不可改变其值&#xff1b;
    &#xff08;3&#xff09;编译时统一进行处理&#xff1b;而变量是在运行时才能知道它的值&#xff1b;
    &#xff08;4&#xff09;关键字定义&#xff1a;语法&#xff1a; final 常量名 &#61;值; //关键字&#xff1a;关键字是指Java中具有特殊功能的词&#xff0c;变量、类和方法等在命名时应该避免去使用这些关键字。常用的关键字&#xff1a;Abstract、break、case、catch、char、continue、do、double、else、final、finally、float、for、if、import、instanceof、int、class、long、private、protected、public、return、short、static、this、throw、throws、transient、try、void、volatile、while等。
  • 示例&#xff1a;
    int int1 &#61; 123&#xff1b;//整型常量&#xff1b;
    double d1 &#61; 12.3; //双精度浮点型&#xff1b;
    boolean b1 &#61; true; //布尔型&#xff1b;
    final double TAX &#61; 100&#xff1b;//用户声明&#xff1b;

运算符


  • 算术运算符&#xff1a;&#43;加 —减 *乘 /除 %取余
    示例&#xff1a;注意数据类型

public class Testdome1 {public static void main(String[] args) {int a &#61; 10;int b &#61; 4;int c &#61; a / b;System.out.println("c"); /cfloat f1 &#61; 5 / 2; //2.0float f2 &#61; (float) (5.0 / 2); //2.5float f3 &#61; (float) 5 / 2; //2.5float f4 &#61; 5 / (float) 2; //2.5System.out.println(f1);System.out.println(f2);System.out.println(f3);System.out.println(f4);}}

取余&#xff1a; System.out.println(-10%3);//-1
System.out.println(-10%-3);//-1
System.out.println(10%-3);//1
System.out.println(10%3);//1


  • 关系运算符&#xff1a;> <>&#61; <&#61; &#61;&#61;等于 !&#61;不等于
  • 逻辑运算符&#xff1a;&&逻辑与&#xff08;111/100&#xff09; ||逻辑或&#xff08;000/011&#xff09; !非
  • 位运算符&#xff1a;&按位与&#xff08;乘法&#xff09; |按位或&#xff08;加法&#xff09; ^按位异或&#xff08;同为0&#xff0c;异为1&#xff09; ~&#xff08;&#xff09;
  • 移位运算符&#xff1a;>>右移&#xff08;除2^n ,补符号位&#xff09; <<左移&#xff08;乘2的n移位数&#xff09; >>>无符号右移&#xff08;只补0&#xff09;
  • 条件运算符&#xff1a;三目运算符 &#xff1f;&#xff1a;
    a?b &#xff1a;c &#xff1a;要求第一个操作元a的值必须是boolean类型数据。运算法则是&#xff1a;当a的值是true时&#xff0c;a?b&#xff1a;c运算的结果是b的值&#xff1b;当a的值是false时&#xff0c;a?b&#xff1a;c运算的结果是c的值。
  • 自增自减运算符&#xff1a;&#43;&#43; —— 单目运算符&#xff0c;优先级是2级
    &#43;&#43;x&#xff0c;–x表示在使用x之前&#xff0c;先将x的值加1或减1。
    x&#43;&#43;&#xff0c;x–表示在使用x之后&#xff0c;将x的值加1或减1
  • 例&#xff1a;注意自增自减运算符在操作元之前还是之后&#xff0c;以及赋值时的变化。
    &#xff08;1&#xff09;

int a&#61;10;&#43;&#43;a;System.out.println(a);//11int b &#61; &#43;&#43;a;System.out.println(a);//12

&#xff08;2&#xff09;

int a&#61;10;a&#43;&#43;;System.out.println(a);//11

&#xff08;3&#xff09;

int a&#61;10;int b &#61; a&#43;&#43;;System.out.println(b);//10a &#61; a&#43;&#43;;System.out.println(a);//11

Over…欢迎一起讨论交流


推荐阅读
  • 在C#编程中,数值结果的格式化展示是提高代码可读性和用户体验的重要手段。本文探讨了多种格式化方法和技巧,如使用格式说明符、自定义格式字符串等,以实现对数值结果的精确控制。通过实例演示,展示了如何灵活运用这些技术来满足不同的展示需求。 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • com.sun.javadoc.PackageDoc.exceptions()方法的使用及代码示例 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • poj 3352 Road Construction ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 本文详细解析了客户端与服务器之间的交互过程,重点介绍了Socket通信机制。IP地址由32位的4个8位二进制数组成,分为网络地址和主机地址两部分。通过使用 `ipconfig /all` 命令,用户可以查看详细的IP配置信息。此外,文章还介绍了如何使用 `ping` 命令测试网络连通性,例如 `ping 127.0.0.1` 可以检测本机网络是否正常。这些技术细节对于理解网络通信的基本原理具有重要意义。 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • 应用链时代,详解 Avalanche 与 Cosmos 的差异 ... [详细]
  • 2022年7月20日:关键数据与市场动态分析
    2022年7月20日,本文对当日的关键数据和市场动态进行了深入分析。主要内容包括:1. 关键数据的解读与趋势分析;2. 市场动态的变化及其对投资策略的影响;3. 相关经济指标的评估。通过这些分析,帮助读者更好地理解当前市场环境,为决策提供参考。 ... [详细]
author-avatar
2233
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有