热门标签 | 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…欢迎一起讨论交流


推荐阅读
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • Python中sys模块的功能及用法详解
    本文详细介绍了Python中sys模块的功能及用法,包括对解释器参数和功能的访问、命令行参数列表、字节顺序指示符、编译模块名称等。同时还介绍了sys模块中的新功能和call_tracing函数的用法。推荐学习《Python教程》以深入了解。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • DSP中cmd文件的命令文件组成及其作用
    本文介绍了DSP中cmd文件的命令文件的组成和作用,包括链接器配置文件的存放链接器配置信息、命令文件的组成、MEMORY和SECTIONS两个伪指令的使用、CMD分配ROM和RAM空间的目的以及MEMORY指定芯片的ROM和RAM大小和划分区间的方法。同时强调了根据不同芯片进行修改的必要性,以适应不同芯片的存储用户程序的需求。 ... [详细]
  • php缓存ri,浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
    thinkPHP的F方法只能用于缓存简单数据类型,不支持有效期和缓存对象。S()缓存方法支持有效期,又称动态缓存方法。本文是小编日常整理有关thinkp ... [详细]
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社区 版权所有