Java 变量和数据类型笔记

Java 变量和数据类型笔记

1.变量的基本概念(两个要素)

  • 变量名
    • 当需要在程序中记录单个数据内容时,则声明一个变量即可,而声明变量的本质就是在内存中申请一个存储单元,由于该存储单元中的数据内容可以发生改变,因此得名为"变量"。
  • 数据类型
    • 由于存放的数据内容大小不一样,导致所需存储单元的大小不一样,在Java语言中使用数据类型加以描述,为了便于下次访问还需要给该变量指定一个名字,用于记录该变量对应的存储单元。

2.变量的声明方式

  • # 常用变量声明方式
    数据类型 变量名 = 初始值; 
    # 必须以分号结尾,标识一行代码结束;可以只定义变量,不赋初值
    
  • 变量声明练习

    public class VarTest{
    	
    	public static void main(String[] args){
    		// 1.声明一个变量并初始化
    		int age = 21;
    		// 2.打印变量值
    		// + : 字符串连接符,将两边的内容连接起来,还是一个字符串
    		System.out.println("age = " + age);
    	}
    }
    
    PS E:\LaGou-Java\Class-Learning\Class-note\模块一 Java编程基础\02任务二 变量和数据类型\code> javac .\VarTest.java
    PS E:\LaGou-Java\Class-Learning\Class-note\模块一 Java编程基础\02任务二 变量和数据类型\code> java VarTest
    age = 21
    

3.使用变量注意事项

  • 使用变量之前需要先声明,指定数据类型
  • 使用变量之前需要初始化
  • 变量不能重复声明

4.标识符命名规则

  • 由数字,字母,下划线组成(还有$,但是不常用),数字不能开头

  • 不能使用Java语言关键字
    在这里插入图片描述

  • 区分大小写,长度没有限制但不宜过长

  • 尽量见名知意,支持中文但不推荐使用

  • 标识符可以给 类/变量/属性/方法/包起名字。

5.Scanner扫描器使用

  • 文件开头

    • // 导入java目录中util目录中的Scanner类
      import java.util.Scanner;
      
  • 文件main函数中实现部分

    • // 创建一个扫描器来扫描键盘输入的内容,System.in代表键盘输入
      Scanner sc = new Scanner(System.in);
      // 通过扫描器读取一个字符串数据放入变量name中
      name = sc.next();
      // 通过扫描器读取一整数数据放入变量name中
      age = sc.nextInt();
      

6.代码优化

  • 变量随用随声明
  • 输出语句多句合并为一句

7.数据类型

  • 基本数据类型
    • byte,short,int,long,float,double,boolean,char
  • 引用数据类型
    • 数组,类,接口,枚举,标注,字符串

8.常用的进制

  • 十进制:逢十进一

  • 二进制:逢二进一

    • 二进制中最高位(最左边的一位)用于代表符号位,若该位是0则表示非负数,若该位是1则表示负数
  • 八进制,十六进制其实都是二进制的简写

9.进制之间的转换

  • 正十进制转换为二进制
    • 除二取余法:使用十进制整数不断除以2取出余数,商为零时,余数逆序排序
      • 例:十进制45转换为二进制结果为:10 1101(0b,0B可为二进制前缀,binary),64位操作系统有64位,前面全部用0补齐64位才是真正的二进制
    • 拆分法:将十进制整数拆分为若干个二进制权重的和,有该权重下面写1,否则写0
  • 正二进制转换为十进制
    • 加权法:使用二进制中的每个数字乘以每一位的权重累加
  • 负十进制转换为二进制的方式
    • 先将十进制的绝对值转换为二进制,然后按位取反再加一(补码)
      • 例:十进制-45转换为二进制为:1101 0011
      • 当十进制的45和-45都转化为二进制数时,相加,结果会出现高位溢出(第65位1将会丢弃)
  • 负二进制转换为十进制
    • 先将二进制减一,再按位取反,然后使用加权法

10.整数类型表示的范围

  • byte

    • 非负数:
      • 0000 0000 - 0111 1111(0 ~ 127)
    • 负数:
      • 1000 0000 - 1111 1111(-128 ~ -1)
    • 在内存空间中占一个字节,-2^7 ~ 2^7 - 1(-128 ~ 127)
  • short

    • 在内存空间中占两个字节,-2^15 ~ 2^15 - 1(-32768 ~ 32767)
  • int**(推荐使用,默认为int类型)**

    • 在内存空间中占四个字节,-2^31 ~ 2^31 -1(-2147483648 ~ 2147483647)
  • long

    • 在内存空间中占八个字节,-2^63 ~ 2^63 - 1()

在Java程序中直接写出的整数数据叫做直接量/字面量/常量,默认为int类型。若希望表达比long更大的直接量,则在直接量的后面加上“l”或“L”,推荐“L”。

11.整数类型的笔试考点

  • 整数不能作为标识符的原因:

    • 分不清标识符和直接量
    • 如果也带尾缀,则无法进行统一标准,取决于程序员自身的水平,Java官方规定,数字不能开头
  • 使用不同整数类型的变量为另一个变量赋值报错:

    • 这是一个变量,数值是否会发生变化,不得而知

    • 当进行赋值的时候,无法直接确定当前的变量是否在自己的整数范围之内,还需要继续进行计算才能确定,直接报错让程序员自行进行检查

    • // 6.错误代码测试
      int i2 = 25;
      byte b2 = i2; // 错误: 不兼容的类型: 从int转换到byte可能会有损失
      System.out.println("b2 = " + b2);
      
  • 比long还大的整数表示:

    • // 5.声明一个long类型的变量并初始化
      // 若描述比long类型还大的数据则使用java.math.BigInteger类型
      long L1 = 2147483650L;
      System.out.println("L1 = " + L1);
      

12.浮点类型

  • float

    • 在内存空间中占四个字节,叫做单精度浮点数,一般表示七位有效数字

      • 七位有效数字:从左起第一位开始算起,小数点不算,数七位为有效数字,剩余部分无法保证有效,可能会出现精度损失

      • 如果整体长度超过七位,可以在末尾加“f”或“F”,表示此数据为float类型,但是超出部分仍然无法保证精度问题
        // float可以在直接量末尾添加f/F,以指示为float类型,但是因为七位有效数字,最后一位小数精度无法保证
        float f1 = 3.1415926F; // f1 = 3.1415925
        System.out.println("f1 = " + f1);
        
    • 范围:-3.403E38 ~ 3.403E38(指数表示法)

    • int和float字节数相同,为什么表示范围不一样?

      • 与底层二进制结构有关系
        • int:有一个符号位,剩余的整数位
        • float:除了符号位,还有一部分专门用于表示表示整数次方(指数部分),再接下来才表示小数部分,因为有指数部分,所以范围更大一些
  • double**(推荐使用,默认为double类型)**

    • 在内存中占八个字节,叫做双精度浮点数,一般表示十五位有效数字
    • 范围:-1.798E308 ~ 1.798E308(指数表示法)

13.浮点数笔试考点

  • 因为float,double计算不够精确,如何做到精确计算:

    • // 3.笔试考点
      System.out.println("0.1 + 0.2 = " + (0.1 + 0.2)); // 0.1 + 0.2 = 0.30000000000000004
      // float和double运算时会有误差
      // 若希望实现精确运算,借助java.math.BigDecimal类型
      

14.布尔类型

  • boolean:
    • 只有两种:true,false(没有0或1一说,和C语言不同)
    • 描述真假信息的类型
    • 所占内存空间没有明确的规定,可以认为是一个字节(其实一个bit,二进制位就足够了)

15.字符类型

  • char:

    • 用于描述单个字符的数据类型(单引号引起来的单个字符

    • 在内存空间中占两个字节,并且没有符号位

    • 表示范围为(0 ~ 65535)

    • 计算机的底层只识别0和1组成的二进制序列,对于字符’a’这样的图案来说不满足该规则,因此该数据无法直接在计算机中存储,但现实生活中存在这样的图案数据需要计算机存储,为了使得该数据能够存储起来就可以给该数据指定一个编号,然后将编号存储起来即可,该编号就叫做ASCII

      • ASCSI:

        • 要求掌握的ASCII有:‘0’ -48 ‘A’ -65 ‘a’ -97 空格-32 换行符-10
        • // 4.定义一个char类型的变量并初始化
          char c2 = 98;
          System.out.println("c2: " + c2);
          System.out.println("c2 number: " + (int)c2);
          

在这里插入图片描述

  • Unicode字符集:

    • 包含世界各国的字符

    • 站长之家链接:http://tool.chinaz.com/tools/unicode.aspx

    • // 5.使用Unicode字符集打印名字
      // 云梦归遥 - \u4e91\u68a6\u5f52\u9065
      char c3 = '\u4e91';
      char c4 = '\u68a6';
      char c5 = '\u5f52';
      char c6 = '\u9065';
      System.out.println("My name is: " + c3 + c4 + c5 + c6);
      
  • 特殊字符类型:

    • 可以使用 “\” 转义字符

16.基本数据类型之间的转换

  • 自动类型转换

    • 自动类型转换主要是指从小类型到大类型之间的转换
      在这里插入图片描述

    • long类型(8字节)到float类型(4字节)转化的原因:

      • 和底层二进制的结构有关系
      • long能表示(-2^63 ~ 2^63 - 1),而float能表示(1038),可近似转换为((23)38=2114),所以long可以自动转换为float类型
  • 强制类型转换

    • 大类型到小类型之间的转换

      • 目标类型变量名= (目标类型)源类型变量名;
        
      • 强制转换不出现损失的情况(在当前数值范围之内):

        byte b1 = 10;
        short s1 = 20;
        // 3.实现强制类型之间的转换
        b1 = (byte)s1;
        System.out.println("b1 = " + b1 + ", " + "s1 = " + s1); // b1 = 20, s1 = 20
        
      • 强制转换出现损失的情况(超出当前数值范围之内):

        // 4.故意超出byte的范围
        s1 = 128;
        b1 = (byte)s1;
        // short类型的s1:128的二进制数:0000 1000 0000,强转为byte时取低八位,1000 0000,
        // 但是byte类型第一位是符号位,转换为十进制数为-128
        System.out.println("b1 = " + b1 + ", " + "s1 = " + s1); // b1 = -128, s1 = 128
        
        // 4.故意超出byte的范围
        s1 = 128;
        b1 = (byte)s1;
        // short类型的s1:128的二进制数:0000 1000 0000,强转为byte时取低八位,1000 0000,
        // 但是byte类型第一位是符号位,转换为十进制数为-128
        System.out.println("b1 = " + b1 + ", " + "s1 = " + s1); // b1 = -128, s1 = 128
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值