Skip to content

变量

程序中需要变量,我们可以通过不同类型的变量来代表不同的数据,变量是程序的基本组成单位

变量相当于内存中一个数据存储空间的表示,通过变量名,我们可以访问到这个变量的具体值(总之,变量可以代表一个变化的值)

变量有三个基本的要素:类型、名称和值,如int a = 1;

  • 变量需要先声明,再使用,可以简写声明和赋值在同一行
  • 变量的值可以在同一类型中进行不断的变化,即可以重复的进行同一类型的赋值
  • 变量是在内存中的一个存储区域,不同类型的变量,占用的空间大小是不同的,如int占4个字节,double占8个字节
  • 变量名在同一个作用域不能重名

数据类型

Java是强类型语言,每一种数据都要明确数据类型

在实际的使用中,有很多的数据类型,对于不同用途的数据,我们声明不同数据类型的变量

基本数据类型

数值型
  • 整数类型,用来存放整数:

    • byte[1]byte类型(字节),占1个字节,范围-128~127
    • short[2]short类型(短整型),占2个字节,范围-32768~32767
    • int[4]int类型(整型),占4个字节,范围-2147483648~2147483647
    • long[8]long类型(长整型),占8个字节,范围-2^63~2^63-1

    bit是计算机中的最小存储单位,1byte =8bit,字节byte是计算机中的基本存储单位

    byte b = 10;通常情况下,10在Java中默认是一个int类型,但是当把具体的数赋值给byteshort类型同理)时,系统会先判断当前值是否在byte范围内,如果是,就可以正常的赋值,但是以下的方式是不正确的:

    java
    int n = 1;
    byte b = n;   // 编译报错,变量赋值,需要先判断类型

    n在内存中先声明了4个字节大小的存储空间中,但是b声明的存储空间只有1个字节

    总之,具体数赋值,先判断范围;变量赋值,先判断类型

    Java的整型常量(具体值)默认为int型,声明long型常量需后面加上lL,如long n = 1L;

  • 浮点型,用来存放小数:

    • float[4]:单精度浮点类型,占4个字节,范围-3.403E38~3.403E38
    • double[8]:双精度浮点类型,占8个字节,范围-1.798E308~1.798E308

    浮点数在计算机中的存放形式:浮点数=符号位+指数位+尾数位

    其中,尾数部分可能丢失,造成精度的损失(小数都是近似值)

    Java的浮点型常量(具体值)默认为double型,声明float型常量,需后面加f或者F,如float n = 1.1F;float n = 1.1;会报错,不能将double类型赋值给float类型的变量),大的字节范围不能往小的字节范围内放,但是小的字节范围可以往大的字节范围内放,如double n = 1.1f;是正确的,编译不会报错

    通常情况下,我们应该使用double类型,因为它的精度比float型更精确(精度低,会导致过长的小数点后的内容丢失)

    浮点型常量有两种表示形式:

    • 十进制数形式:如:5.12 512.0f .512(前面的0可以省略,但是必须有小数点)
    • 科学计数法形式:如:5.12e2(5.12*10的2次方,返回的是512.0,因为是浮点数类型) 5.12E-2

    浮点数的使用陷阱:

    image-20250313201321542

    计算机在接收8.1的时候,不能确定8.1小数位的1后面是否还有其他的位数,它可能认为是8.10000001,所以,在计算结果的时候,也是以精度的方式进行返回的

    所以说,当我们对小数的运行结果进行相等判断的时候,要格外的注意,应该通过两个数的差值的绝对值,在某个精度范围内进行判断

字符型
  • 字符类型:char[2],存放单个字符'a',该类型占两个字节,可以存放一个汉字

字符常量是用单引号''括起来的单个字符,不能使用双引号,如果使用双引号,就是字符串类型了

char c = "9";编译器就会报错,字符串类型不能赋值给字符类型的变量

String字符串类型,不是基本数据类型,实际上它是一个类,多个字符,我们使用字符串来存放

Java中,char的本质是一个整数,在输出的时候,是unicode码对应的字符,字符类型也可以直接存放一个数字:char c = 97;,但是输出的是a,97在计算机中的ASSCII码中对应的是a,对于任意的汉字字符,也有具体对应的unicode码,如果我们想要将对应的字符转换为对应的unicode码,我们将这个字符通过int类型进行转化即可得到对应的unicode

Java中允许使用转义字符\,来将其后面跟着的字符转变为特殊字符型常量,如char c = '\n';

char类型是可以进行运算的,该类型相当于一个整数,任何字符都要对应的unicode

字符串的比较,使用到了equals的字符串方法:"jlc".equals(name); 判断name字符串类型的值是不是“jlc”,如果是,返回true,否则返回false

字符类型的本质讨论:字符型数据存储到计算机中,需要将字符对应的码值(整数)找出来,如'a'字符:

存储:'a' ---> 码值 ---> 二进制 ---> 存储

读取:二进制 ---> 97 ---> 'a' ---> 显示

布尔型
  • boolean[1]:布尔类型,占1个字节,只允许取truefalse

    boolean类型适用于逻辑运算

    Java语言中,不能使用0或非0的整数来代替falsetrue,这一点和C语言是不同的

自动类型转换

Java程序在进行赋值或者运算时,精度小的类型可以自动转换为精度大的数据类型,这个就是自动类型的转换

image-20250315160649836

箭头的流向表示低精度向高精度进行转换

在理论上,int a = 'c';该语句的语法是错误的,不能将char字符类型赋值给int数值类型,但是有了自动类型转换,精度低的char类型,可以自动的转化为int类型,所有int a = 'c';该语句在编译的过程中不会报错

低精度的类型,可以连跨级别的向高精度的类型进行自动转换

自动类型转换细节:

  1. 有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量(精度)最大的那种数据类型,然后再进行计算

  2. 当我们把容量(精度)大的数据类型赋值给容量(精度)小的数据类型时,就会报错,反之则会进行自动类型的转换

  3. byteshort)和char之间不会互相自动转换

    java
    byte b = 10;
    char c = b;   // 报错,byte类型不会自动转换为char类型
  4. byteshortchar它们三者可以计算,在计算时(不管是单独类型的计算还是混合类型的计算)首先转换为int类型

    java
    byte b = 1;
    short s1 = 1;
    short s2 = b + s1;   // 报错,运算后,转化成了int类型,不能赋值给精度小的short类型
    
    byte b2 = 1;
    byte b3 = b + b2;   // 报错,byte类型在运算后会转化为int类型
  5. boolean类型不参与转换

  6. 自动提升原则:表达式结果的类型自动提升为操作数中最大的类型

强制类型转化

强制类型转化是自动类型转换的逆过程,将容量(精度)大的数据类型转换为容量(精度)小的数据类型,使用时需要加上强制转换符(),但是,强制类型转换可能会造成精度的降低或溢出,需要格外注意

java
int i = (int)1.9;    // 强制将double类型转换为int类型,精度损失了,结果输出为1,掉了小数位

强制类型转换细节:

  1. 强制符号只针对于最近的操作数有效,往往会使用小括号提升优先级

    java
    int x = (int)10 * 3.5 + 6 * 1.5;    // 编译不通过,不能将double类型赋值给int类型
    
    int x = (int)(10 * 3.5 + 6 * 1.5);  // 结果为44

引用数据类型

  • 类(class
  • 接口(interface
  • 数组([]

基本数据类型和String类型的转换

  • 基本数据类型转String类型,语法:将基本类型的值+""即可:

    java
    int n = 100;
    float f = 1.1F;
    double d = 4.5;
    bollean b = true;
    // 基本数据类型转String字符串
    String s1 = n + "";
    String s2 = f + "";
    String s3 = d + "";
    String s4 = b + "";
  • String类型转基本数据类型,语法:通过基本类型的包装类调用parseXX方法:

    java
    String s = "123";
    // String字符串转换为基本数据类型
    int n = Integer.parseInt(s);  // 123
    double d = Double.parseDouble(s);  // 123.0
    float f = Float.parseFloat(s);   // 123.0
    Long l = Long.parseLong(s);   // 123
    byte b = Byte.parseByte(s);   // 123
    short s = Short.parseShort(s);  // 123
    boolean b = Boolean.parseBoolean("true");   // true

    使用基本数据类型对应包装类的相应方法进行转换,将字符串类型转换为基本数据类型

    对于将字符串转换成字符char类型,是将字符串的第一个字符取下来:

    java
    String s = "123";
    s.charAt(0);   // '1'

    注意:将字符串类型转换成基本的数据类型时,要确保字符串类型能够转成有效的数据,如,不能将字母转换成整数,如果格式不正确,系统会抛出异常


加号的使用

在程序中,加号有不同的用途:

  • 当左右两边都是数值型时,则做加法运算
  • 当左右两边有一方为字符串,则做拼接运算

编码

字符和码值的对应关系是通过字符编码决定的(是规定好的)常见的字符编码表有:

  • ASCII:一个字节表示,一共表示了128个字符,实际上一个字节可以表示256个字符,但是ASCII字符集只使用了128个字符,这个编码是为英文国家创建的,英文只有26个字母,加上一些符号,128个字符足够使用了
  • UnicodeASCII表的一个扩展(Unicode码是兼容ASCII码的,同样的'a'都是用97来表示),固定大小的编码,使用两个字节来表示字符,字母和汉字统一都是占用两个字节,比较浪费空间
  • utf-8:大小可变的编码,可以使用1至6个字节来表示一个符号,根据不同的符号而变化字节长度,字母使用一个字节,汉字使用三个字节,在互联网中使用最广的一种Unicode 的实现形式
  • gbk:可以表示汉字,而且范围广,字母使用一个字节,汉字使用两个字节(编码的汉字种类较utf-8少,utf-8汉字是使用三个字节的,涉及到的汉字种类范围广)
  • big5:可以表示繁体中文

不同的编码,对文件的大小是有影响的,有的编码汉字是用两个字节表示的,有的编码汉字是用三个字节表示的,会对保存的文件大小造成影响

Released under the MIT License.