Java数据类型

  • 一、基本类型(四类八种)
  • 1.整数
  • 2.浮点数
  • 3.字符
  • 4.布尔
  • 二、引用类型
  • 三、变量作用域
  • 四、字面值
  • 五、final关键字修饰常量
  • 六、类型转换
  • 七、数值提升
  • 八、打印输出
  • 九、相关例题


一、基本类型(四类八种)

1.整数

(1)int
一个int变量占4个字节(-2^31 ~ 2^31-1).大概是-21亿到+21亿.

//定义一个整型变量
int value = 10;
// 使用代码查看Java中的整型数据范围
 public static void theInt () {
 //Integer是Java标准库中已经实现好的一个类,是int的“包装类”
    System.out.println(Integer.MAX_VALUE);//int最大值
    System.out.println(Integer.MIN_VALUE);//int最小值
//运算结果超出可表示的最大范围,产生溢出
    System.out.println(Integer.MAX_VALUE + 1);
    System.out.println(Integer.MIN_VALUE - 1);
}

21亿这样的数字对于大数据时代来说,是很容易超出的,针对这种情况,Java提供了更大范围的数据类型 long 类型.

(2) long
一个long变量占8个字节(-2^63 ~ 2^63-1)

// 定义长整型变量
long num = 100L;
// 使用代码查看Java中的长整型数据范围
public static void theLong() {
 //Long是long的“包装类”
        System.out.println(Long.MAX_VALUE);
        System.out.println(Long.MIN_VALUE);
//也可写成100l,但因为小写l会与数字1混淆,尽量选择大写L
        long num = 100_0000_0000L;
}

(3)byte
字节类型表示的也是整数,只占一个字节(-128~127)

// 定义字节型变量
byte num = 10;

(4)short
一个short变量占2个字节(-32768 ~ +32767)

// 定义短整型变量
short num = 0;

2.浮点数

(1)double
占8 个字节, 但是浮点数的内存布局和整数差别很大, 不能单纯的用 2 ^ n 的形式表示数据范围.
Java 的 double 类型的内存布局遵守 IEEE 754 标准(和C语言一样), 尝试使用有限的内存空间表示可能无限的小数, 势必会存在一定的精度误差.

// 定义短整型变量
double num = 1.1;
System.out.println(num * num);
// 执行结果
1.2100000000000002
public static void theDouble(){
        double a = 1;
        double b = 2;
        System.out.println(a / b);
//double类型相除,结果为0.5
		System.out.println(1 / 2);
//两个整型数字相除,结果为0,只保留整数部分

        double a = 1.1;
        System.out.println(a * a);
        if (a * a == 1.21) {
            System.out.println("相等");
        } else {
            System.out.println("不相等");
        }
//结果是不相等,会丢失一定的精度,所以要尽量少用==作为else最后判断
        if (a * a - 1.21 < 0.0000001
            && a * a - 1.21 > -0.0000001) {
            System.out.println("相等");
        } else {
            System.out.println("不相等");
        }
//因为精度丢失,用减法再去和一个非常接近于0的数字作比较来替代==会更好

(2)float
占4个字节, 同样遵守 IEEE 754 标准. 由于表示的数据精度范围较小, 一般在工程上用到浮点数都优先考虑 double, 不太推荐使用 float

// 定义单精度浮点型变量,也可写成1.0F
float num =1.0f;

3.字符

(1)char
Java 中使用 Unicode 表示字符.
一个字符占用2个字节, 表示的字符种类更多, 包括中文

//定义字符型变量,用 单引号+单个字母 表示字符字面值
 char ch = 'A';
// 
public static void theChar() {
// 单引号括起来为char型'A',若写成双引号则是String型"A"
        char a = 'A';
        char b = '中';
        System.out.println(a);
        }

4.布尔

(1)boolean
没有规定具体占几个字节,有些JVM的实现是占1个字节,有些占1个比特位
该类型只有两种取值,true / false
Java的boolean类型和int不能相互转换,不存在0和非0表示真假

//定义布尔型变量
 boolean value = true;

二、引用类型

(1)String
不属于基本数据类型,而是引用类型,引用可以理解成是低配指针
有些不太方便表示的字符需要用到转义字符:

转义字符

解释

\n

换行

\r

回到行首

\t

水平制表符

\’

单引号

\"

双引号

\\

反斜杠

// 定义字符串类型变量,用 双引号+若干字符 表示字符串字面值
String str = "hello";
// An highlighted block
public static void theString(){
//需要打印My name is "zsy",其中双引号需要转义,用到/“来表示
        String str1 = "My name is \"zsy\"";
        System.out.println(str1);
//需要打印字符串的长度,用到str。length()
        String str2 = "hehe";
        System.out.println(str2.length());
//用 + 操作来实现字符串的拼接
        String a = "hello";
        String b = "world";
        System.out.println(a + b);
//用 + 来进行字符串和整数的拼接
        String c = "hello";
        System.out.println(c + 10 + 20);
        System.out.println(c + (10 + 20));
        System.out.println(10 + 20 + c);
//执行结果
hello1020
hello30
30hello
    }

三、变量作用域

变量能生效的范围,一般就是该变量定义所在的代码块(大括号内)

public static void main(String[] args) {

        int num = 10;
        System.out.println("num = " + num);
//输出num=10
    }
        System.out.println(num);
//编译失败,找不到变量num
}

四、字面值

字面值常量

解释

010

int型(十进制)

0x10

int型(八进制),数字 0 开头,010 是十进制的 8

10L

long型,也可写作 10l

1.0

double型。也可写作 1.0d 或 1.0D

1.5e2

double型,科学计数法表示,相当于 1.5 * 10^2

1.0f

float型,也可写作 1.0F

true

boolean型,同样的还有false

‘a’

char型,单引号中只能有一个字符

“abc”

String型,双引号中可以有多个字符

五、final关键字修饰常量

经过final修饰后即为常量,不可再像变量一样分配值

public static void theFinal(){
final int num = 10;
        num = 20;
        System.out.println(num);
        }
//编译错误,无法为最终变量num分配值

六、类型转换

public static void typeConversion() {
 //long 表示的范围更大,可以将 int 赋给 long ,但不能将 long 赋给 int
 
 //同理, int 也可以赋给 double ,但使用int字面值常量赋给 short 和 byte 的时候,
 //Java会自动进行校验,判定赋值是否合理
 
 // int 和 boolean 不能相互赋值,类型不兼容
        int a = 10;
        long b = 20_0000_0000L;
        b = a;//编译通过
        a = b;//编译出错,可能会损失精度
    
// 但凡代码中涉及到 强制类型转换,
// 意味着代码的正确性, 就需要程序猿人工来保证了.
        a = (int)b;

        int a = 10;
        double b = 20.0;
        b = a;
        a = (int)b;//a = 20,丢失小数部分
        
//boolean 和 int 强制转换也不行
        int a = 10;
        boolean b = true;
        a = (int)b;//编译出错
        b = a;//编译出错

 //整数转字符串
        int num = 10;
        //方法1
        String str = "" + num;
        System.out.println(str);//str=10
        //方法2
        String str1 = String.valueOf(num);
        System.out.println(str1);//str=10

 //字符串转整数
        String str = "10.5";
        double num = Double.parseDouble(str);//num=10.5
        int num1 = Integer.parseInt(str);//编译错误
             
        String str1 = "100";
        double num = Double.parseDouble(str1);//num=100.0
        int num1 = Integer.parseInt(str1);//num1=100                
}

七、数值提升

public static void valueIncrease() {
 		int a = 10;
        long b = 20;
//两个不同数值类型相加,会把低字节提升至高字节再进行相加,
//然后用高字节类型接收结果,要用低字节接收就要用强制类型转换
        long ret = a + b;//编译成功
        int ret = a + b;//编译出错,long 转换 int 丢失精度

        byte a = 10;
        byte b = 20;
        byte c = (byte) (a + b);//编译成功
        byte d = a + b;//编译错误
 //byte类型在进行 + 操作时,会提升至int类型,得到int类型结果再赋给d
 //short 和 byte 这种不满4字节的类型计算时都会提升至4字节int进行计算
 }

八、打印输出

public static void thePrint(){
//println输出的内容自带%n
	System.out.println(msg); // 输出一个字符串, 带换行
	System.out.print(msg); // 输出一个字符串, 不带换行
	System.out.printf(format, msg); // 格式化输出
	System.out.format(format, msg); // 完全等同于 printf
}

九、相关例题

例1:经过强制类型转换以后,变量a,b的值分别为多少(B)
short a =128;
byte b =(byte) a;

A.128 127
B.128 - 128
C.128 128
D.编译错误

题解:
short占两个字节,表示 -2^7 ~ 2^7-1
byte占一个字节,表示 -128 ~ 127
所以,a = 128;
经过强制类型转换 b= 128 超出可表示的范围,转换成二进制为补码1000 0000,第一位为符号位,为负,反码0111 1111,原码就是1000 0000,为-128;

例2:下面属于java包装类的是( 	BCD )

A.String
B.Long
C.Character
D.Short

题解:
BCD分别是long,char,short的包装类
String不是包装类,也不是基础数据类型

例3:下面关于变量及其范围的陈述哪些是不正确的( B )

A.实例变量是类的成员变量
B.实例变量用关键字static声明
C.在方法中定义的局部变量在该方法被执行时创建
D.局部变量在使用前必须被初始化

题解:
static声明的是 类变量
实例变量是在类内而方法外声明定义的变量,也叫做成员变量