二、java基础——变量、数据类型

本文介绍了Java中的变量概念,包括变量的定义、数据类型(基本和引用)、静态变量与实例变量的区别,以及整型、浮点型、字符型和布尔型的详细说明。还讨论了类型转换和溢出问题,提醒开发者在处理大数运算时需注意精度和溢出风险。
摘要由CSDN通过智能技术生成

1、变量

变量:可以变化的量。本质上代表一个”可操作的存储空间”,空间位置确定,里面存放的值不确定。通过变量名来访问“对应的存储空间”,来操纵这个“存储空间”存储的值。

  • java是一种强类型语言,每个变量必须声明其类型。变量的数据类型决定变量占据存储空间的大小。

  • java变量是程序中最基本的存储单元,其要素包括:变量名、变量类型和作用域。变量在使用前必须对其声明, 只有在变量声明以后,才能为其分配相应长度的存储空间。

 //数据类型 变量名 = 值;逗号隔开用来声明多个同类型变量
  • 每个变量都有数据类型,可以是基本数据类型。也可以是引用类型

  • 变量名必须是合法的标识符

1.1 分类

  1. 类变量(静态变量)

  2. 实例变量(成员变量)

  3. 局部变量

 public class demo2 {
     //属性:变量
 ​
     //类变量【类内部】 static修饰
     static double salary =3000;
 ​
     //实例变量【类内部,方法外部】:从属于对象,如果不自行初始化,这个类型的默认值
     //除了基本类型,其余的默认值都是null
     String name;
     int age;
     public static void main(String[] args) {
         //局部变量【方法/语句块】:必须声明和初始化值
         int i =10;
         System.out.println(i);
 ​
         //变量类型 变量名 = new Demo2();
         demo2 d = new demo2();
         System.out.println(d.age);
         System.out.println(d.name);
 ​
         //类变量
         System.out.println(salary);
     }
 }
  • 局部变量

方法或语句块内部定义的变量。声明周期从声明位置开始到方法/语句块执行完毕为止。

局部变量在使用前必须先声明、初始化(赋值)再使用。

  • 成员变量(实例变量)

方法外部、类内部定义的变量。从属于对象,声明周期随对象的始终。

如果不自行定义初始化,会自动初始化该类型默认的初始值。

  • 静态变量(类变量)

使用static定义。从属于类,生命周期伴随类始终,从类加载到卸载。

如果不自行初始化,会自动初始化成该类型的默认初始值。

2、数据类型

  • 基本数据类型

  • 引用类型

基本数据类型】:

  1. 数值型:byte、short、int、long、float、double

  2. 字符型:char

  3. 布尔型:boolean:true、false

引用数据类型】( 4 个字节,记录其引用对象的地址):

  1. 类:class

  2. 接口:interface

  3. 数组

2.1 整型

【进制表示】:

  • 十进制:99,-500,0

  • 八进制:以0开头,eg:015

  • 十六进制:以0x或0X开头,eg:0x15

  • 二进制:以0b或0B开头,eg:0b10010010

Java 语言的整型常数默认为 int 型,声明 long 型常量可以后加‘ l ’或‘ L ’.

2.2 浮点型

  • float

    又称单精度类型。尾数可以精确到 7 位有效数字,离散、舍入误差、大约、接近但不等于。

    →:果需要进行不产生舍入误差的精确数字计算BigDecimal 数学工具类

    尽量不使用float浮点数进行比较

  • double

    又称双精度类型,数值精度约是 float 类型的两倍,绝大部分应用程序都采用 double 类型。

  • float类型的数值有一个后缀F或者f ,没有后缀F/f的浮点数值默认为double类型。也可以在浮点数值后添加后缀D或者d, 以明确其为double类型

 float f = 0.1f;
 double d = 0.1;
 System.out.println(f = d);//→false
 float d1 = 23232222233333323233f;
 float d2 = d1+1;
 System.out.println(d1 == d2);//true

reaon:由于字长有限,浮点数能够精确表示的数是有限的,因而也是离散的。 浮点数一般都存在舍入误差,很多数字无法精确表示(例如0.1),其结果只能是接近, 但不等于

  • java.math 包下面的两个有用的类:BigInteger 和 BigDecimal,这两个类可以处理任意长度的数值。BigInteger 实现了任意精度的整数运算。BigDecimal 实现了任意精度的浮点运算。

 //科学计数法
 double f = 314e2; //314*10^2-->31400.0
 double f2 = 314e-2; //314*10^(-2)-->3.14

2.3 字符型

字符型在内存中占 2 个字节,在 Java 中使用单引号来表示字符常量。例如’A’是一个字符,它与”A”是不同的,”A”表示含有一个字符的字符串

char 类型用来表示在 Unicode 编码表中的字符。Unicode 编码被设计用来处理各种语言的文字,它占 2 个字节,可允许有 65536 个字符。

  • 强制转换

 char c1 = 'a';
 char c2 = '中';    
 System.out.println(c1);   
 System.out.println((int)c1);
 System.out.println(c2);
 System.out.println((int)c2);
  • 编码:Unicode表 2字节 (0-65536),通常用从’\u0000’到’\uFFFF’之间的十六进制值来表示(前缀为 u 表示 Unicode)

  • Excel :2^16=65536

  • 所有字符的本质还是数字

 char c3= '\u0061';
 System.out.println(c3);
  • 转义字符

  • String 类,其实是字符序列(char sequence), 本质是 char 字符组成的数组。

  • 对象,从内存分析

 String s1 = new String("zhangsan");
 String s2 = new String("zhangsan"); 
 System.out.println(s1==s2); // false
 ​
 String s3 = "zhangsan";
 String s4 = "zhangsan";
 System.out.println(s3==s4);//true

2.4 布尔型

boolean 类型有两个常量值,true 和 false,在内存中占一个字节或 4 个字节→流程控制。

Boolean flag = true;
 if(flag) {
     // true 分支
 } else {
     // false 分支
 }
  1. 在 Java 虚拟机中没有任何供 boolean 值专用的字节码指令,Java 语言表达式所操作的boolean 值,在编译之后都使用 Java 虚拟机中的 int 数据类型来代替,而 boolean 数组将会被编码成 Java虚拟机的 byte 数组,每个元素 boolean 元素占 8 位。

  2. 说 JVM 规范指出 boolean 当做 int 处理,也就是 4 字节,boolean 数组当做 byte 数组处理,这样我们可以得出 boolean 类型占了单独使用是 4 个字节,在数组中是确定的 1 个字节。

2.5 类型转换

  • byte ,short ,char→int→ long→float→double

1. 自动类型转换(小→大)

八种基本数据类型,除了 boolean 类型之外的七种类型是可以自动转化的(虚线:精度缺失问题)。可以将整型常量直接赋值给 byte、 short、 char 等类型变量,而不需要进行强制类型转换,只要不超出其表数范围即可

 int i =128;
 double d = 123;
 byte b1 =(byte)i;
 byte b2 = d;
 System.out.println(i);//128
 System.out.println(b1);//-128
2. 强制类型转换(大→小)

强制类型转换,又称造型(cast)。在有可能丢失信息的情况下进行的转换是通过造型来完成的,可能造成精度降低或溢出。

当将一种类型强制转换成另一种类型,而又超出了目标类型的表数范围,就会被截断成为一个完全不同的值。

 int x = 300;
 byte bx = (byte)x; //值为 44

【注意点】

  1. 不能对布尔类型进行转换

  2. 不能把对象类型数据转换为不相干的类型

  3. 把高容量的时候可能存在内存溢出或精度问题

 System.out.println((int)123.4);//123
 System.out.println((int)-45.89f);//-45

【溢出问题】

  • jdk7新特性:数字之间可以用下划线进行分割

 int money = 10_0000_0000;
 int years = 20;
 int toal1 = money*years;//-1474836480;计算溢出
 long toal2 = money*years;//-1474836480;默认是int,转换前就已经存在溢出问题
 long total3 = money*(long)years;//20000000000;先把一个数转换为long类型
 ​
 //L   l

【注意点】:

  1. 操作比较大的数时,要留意是否溢出,尤其是整数操作时。

  2. L和l(小写)混淆→L

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值