Java基础语法
基本数据类型
- java中的数据类型分两大类:
- 基本的数据类型:8种
-
数值型:
- 整形:byte、short、int、long
- 浮点型:double、float
-
字符型:char
-
布尔型:boolean
-
- 引用的数据类型:类、接口、注解、枚举、数组
- 基本的数据类型:8种
- 数据都是存放在内存中,Java内存大体可以分为堆、栈、常量池、方法区
堆 | 栈 | 方法区 |
---|---|---|
运行时数据区 | 存取速度快 | 用来存储类型信息 |
运行时动态分配内存 | 数据可以共享 | 常量池 |
自动垃圾回收 | 数据大小和生命周期必须确定,不够灵活 | 用来存储某类型的常量信息 |
存取速度较慢 |
- 每种数据类型在内存中占有不同的长度;
• 计算机存储设备的最小信息单元叫“位(bit)”,又称之为“比特位”;
• 连续的8个位成为1个“字节(byte)”;
• 操作系统分配内存最少1个字节,即8 个位,而不是1个位;
• 长度越长,所表示的范围就越大;
• 每种数据类型在内存中占有不同的长度;
• 计算机存储设备的最小信息单元叫“位(bit)”,又称之为“比特位”;
• 连续的8个位成为1个“字节(byte)”;
• 操作系统分配内存最少1个字节,即8 个位,而不是1个位;
• 长度越长,所表示的范围就越大;
类型 | 长度(位) | 长度(字节) | 表示范围 |
---|---|---|---|
byte | 8位 | 1字节 | -128~127 |
short | 16位 | 2字节 | − 2 15 -2^{15} −215~ 2 15 − 1 2^{15}-1 215−1 |
int | 32位 | 4字节 | − 2 31 -2^{31} −231~ 2 31 − 1 2^{31}-1 231−1 |
long | 64位 | 8字节 | − 2 63 -2^{63} −263~ 2 63 − 1 2^{63}-1 263−1 |
float | 32位 | 4字节 | -3.403E38~3.403E38(3.40292347*10的38次方) |
double | 64位 | 8字节 | -1.798E308~1.798E308(1.798*10的308次方) |
char | 16位 | 2字节 | 0~ 2 6 − 1 2^6-1 26−1,表示一个字符,如(‘a’,‘A’,‘0’,‘中’) |
boolean | 8位 | 1字节 | 逻辑常量只有两个值true与false |
- 基本的数据类型的默认值
类型 | 默认值 |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0 |
float | 0.0 |
double | 0.0 |
char | ‘’ 空字符(\u0000) |
boolean | false |
- 代码检验基本数据类型的默认值
public class Test1 {
/**
* 查看Java基本数据类型的默认值
* @param args
*/
//全局变量
//int num;
//使用静态的全局变量
static int num;
static byte num2;
static short num3;
static long num4;
static float num5;
static double num6;
static char num7;
static boolean flag;
public static void main(String[] args) {//static修饰的方法,是静态方法,静态方法只能访问静态的成员变量
/*
// num为局部变量(在方法中声明的变量) 使用局部变量必须要进行初始化
int num;
System.out.println("int类型的默认值"+num);*/
System.out.println("int类型的默认值: "+num);
System.out.println("byte类型的默认值: "+num2);
System.out.println("short类型的默认值: "+num3);
System.out.println("long类型的默认值: "+num4);
System.out.println("float类型的默认值: "+num5);
System.out.println("double类型的默认值: "+num6);
System.out.println("char类型的默认值: "+num7);
System.out.println("boolean类型的默认值: "+flag);
}
}
- 不同的基本数据类型之间可以进行转换;
• 从表示范围小的类型转换为表示范围大的类型,可以直接转换,称为隐式转换;
• 从表示范围大的类型转换为表示范围小的类型,需要强制转换,称为显式转换;
• 数值类型和boolean类型之间就不能转换;强制也不可以;
public class Test2 {
public static void main(String[] args) {
//自动类型转换
int num=10;
double num2=num;
System.out.println("num="+num);
System.out.println("num2="+num2);
//强制类型转换
double num3=4.5;
int num4=(int)num3;
System.out.println("num3="+num3);
System.out.println("num4="+num4);
}
}
- • 用“=”可以为任何一种基本数据类型的变量赋值;
• 赋值时主要不要超过表示范围,否则将出现编译错误;
• char类型使用’'引用单个字符赋值;也可以使用非负整数(ASCII码)进行赋值;
了解:ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符。 - 如果是整数,默认是int类型
如果是小数,默认的double类型
57 是int , 4.5 是double
• 小数默认是double类型;
• 使用f/F后缀显式表示float类型;使用d/D后缀显式使用double类型; - 可以使用==、!=、>、<、>=、<=对基本数据类型的数值进行比较运算;
- 练习:比较1.0d和1.0f是否相等,0.3d和0.3f是否相等。
public class Test3 {
public static void main(String[] args) {
double d1=1.0d;
float f1=1.0f;
System.out.println("d1==f1吗? "+(d1==f1)); //ture
System.out.println("d1!=f1吗? "+(d1!=f1)); //false
double d2=0.3d;
float f2=0.3f;
System.out.println("d2==f2吗? "+(d2==f2)); //false
System.out.println("d2!=f2吗? "+(d2!=f2)); //ture
/*
原因:在比较时,会把十进制数转换为二进制
0.3在转二进制后为0.01001001001.....的无限循环小数
而double和float类型的精度不同,所以0.3d不等于0.3f
而1.0不存在这个问题,所以1.0d=1.0f
1.0f 1.0d 的二进制表示,不管是32位还是64位,都是相同的。
0.3f 0.3d的二进制表示,32位和64位不同,所以是false
0.3f转换为二进制 每次*2取整作为二进制位,小数部分继续*2
0.3x2=0.6 取0
0.6x2=1.2 取1
0.2x2=0.4 取0
0.4x2=0.8 取0
0.8x2=1.6 取1
0.6x2=1.2 取1
开始循环
所以结果0.01001 1001 1001……
*/
}
}
- 基本的数据类型和引用的数据类型(绝大多数情况)
基本数据类型 | 引用数据类型 | |
---|---|---|
存放位置 | 栈内存 | 地址(引用)存在栈内存,内容存在堆内存 |
赋值方式 | 用=直接赋值 | 用new创建对象赋值 |
String和Integer都是引用的数据类型