在java语言中,“数据”被称“字面量”

数据类型

各种数据类型的数值范围

用来声明变量,程序在运行过程中根据不同的数据类型分配不同大小的空间。

分基本数据类型和引用数据类型

类型

所占字节

默认值

整数型

byte

1字节(-128~127)

0

short

2字节(-32768~32767)

0

int

4字节(-2147483648~2147483647)

0

long

8字节

0L

浮点型

float

4字节

0.0F

double

8字节

0.0D

字符型

char

2字节(0~65535)

'\u0000'

布尔型

boolean

视编译环境而定

false

引用数据类型

String

null

java中boolean类型的值只有两个值:true和false,不像 c 或 c++,非零 和 0 也可以表示布尔类型

例子

1 package second;
 2 
 3 public class Test {
 4     int a;
 5     double b;
 6     boolean c;
 7     char d;
 8     float f;
 9     byte e;
10     long h;
11     short j;
12     public static void main(String args[]){
13         Test a=new Test();
14         System.out.println("整型的默认值是:"+a.a);
15         System.out.println("双精度浮点型的默认值是:"+a.b);
16         System.out.println("布尔型的默认值是:"+a.c);
17         System.out.println("字符型的默认值是:"+a.d);
18         System.out.println("byte的默认值是:"+a.e);
19         System.out.println("单精度浮点型的默认值是:"+a.f);
20         System.out.println("短整型的默认值是:"+a.j);
21         System.out.println("长整型的默认值是:"+a.h);
22     }
23 }
24

char类型

Java中的字符编码

        char类型对应的是文字,每个国家文字不一样,文字不能直接通过自然算法转换成二进制,所以字符编码诞生,字符编码是人为定义的一套转换表,本质上是一本字典,描述了文字与二进制之间的对照关系(某个计算机协会规定的),编码和解码的时候必须采用同一套字符编码方式,不然会乱码,英文对应的字符编码方式是:ASCII码(以1个byte进行储存)。JAVA中,char占2字节,16位,可存放汉字

‘a’=97
'A'=65
'0'=48

'a'-->采用ASCII码进行编码-->01100001     01100001-->采用ASCII码进行解码-->‘a’

java为了国际化,为了支持所有国家的语言,所以java采用的编码方式为Unicode编码(包括:UTF-8,UTF-16,UTF-32等)。例如’中’对应的Unicode码是’\u4e2d’。在实际开发中几乎所有的团队都会使用Unicode编码方式,因为这种方式更通用,兼容性更好。

char赋值

char a='a'; //任意单个字符,加单引号。
char a='中';//任意单个中文字,加单引号。
char a=111;//整数 0~65535  十进制、八进制、十六进制均可,输出字符编码表中对应的字符
           //注:只能放单个字符

char运算

char类型是可以运算的因为char在ASCII等字符编码表中有对应的数值。在JAVA中,对char类型字符运行时,直接当做ASCII表对应的整数来对待。

例1

public class Test {
    public static void main(String[] args) {

        int a='中'+'国';//20013+22269=42282
        System.out.println(a);

        FileInputStream fis=null;
        try {
            fis = new FileInputStream("Test02.txt");
            System.out.println("流中还没有被读到的字节数量为:"+fis.available());
            //'中'和'国'都占用了三个字节,采用UTF-8编码,下面三个结果是UTF-8编码后的结果
            System.out.println(fis.read());//228
            System.out.println(fis.read());//184
            System.out.println(fis.read());//174

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            if(fis!=null){
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

例2 

char m='a';   //-->a
char m='a'+'b';  // -->97+98=195=? char类型相加,提升为int类型,输出对应的字符
int m='a'+'b';   //-->195 195没有超出int范围,直接输出195
char m=197;   //-->? 输出字符编码表中对应的字符
char m='197';   //-->报错 因为有单引号,表示是字符,只允许放单个字符
char m='a'+1;   //-->b 提升为int,计算结果98对应的字符是b
char m='中'+'国';   // -->20013+22269=42282=ꔪ
char m='中'+'国'+'国'+'国';  // -->报错 int转char有损失。因为结果已经超出char类型的范围。
int m='中'+'国'+'国'+'国';   //-->86820
char m='中'+1;   //-->丮 1是int,结果提升为int,输出对应的字符
char m='中'+"国"; // -->报错 String无法转换为char
System.out.println('中'+"国");  /*-->中国 没有变量附值的过程,String与任何字符用+相连,转换为String*/

char a = 97; //-->为char类型变量 a 赋值常量值 97
char b = 'a'+3; //-->d  97+3=100,ASCII对应的字符为 d
char c = a+3; //报错,混合运算时a自动转化为3的数据类型int,合起来为int,JVM判断为类型不兼容

数据类型转换

字面量的默认类型

Java和C一样,也是遵循下列的默认规则:

  • 任何一个整数型的字面量/数据默认被当作 int 类型处理,如果想转换成long类型来处理,需要在字面量后面加 L/l
  • 任何一个浮点型字面量/数据默认被当作 double 来处理,如果想转换成float类型,需要在字面量后面加 F/f
long a=1000L;    //不加L也行,触发自动类型转换机制
float b=3.14F;   //不加F不行,需进行强制类型转换(double)

自动类型转换

  •  八种数据类型中,除boolean类型不能转换,剩下七种类型之间都可以进行转换
  • 小容量向大容量转换称为 自动类型转换,容量从小到大的排序为:byte < short(char)< int < long < float < double
byte byte01=1;
    short short01=2;
    char char01=3;
    int int01=4;
    long long01=5;
    float float01=3.14F;
    double double01=3.14;
    
    short01=byte01;
    char01=short01;//错误
    int01=char01;
    long01=int01;
    float01=long01;
    double01 = float01;

强制类型转换

  • 如果整数型字面量没有超出 byte、short、char 的取值范围,可以直接将其赋值给byte、short、char类型的变量
  • 大容量转换为小容量,称为 强制类型转换,编写时必须添加“强制类型转换符”,但运行时可能出现精度损失,谨慎使用
  • byte、short、char 类型混合运算时,先各自转换成int类型在做运算
  • 多种数据类型混合运算时,各自先转换成表达式中容量最大的那一种再做运算
//没超出范围
byte a=127;        
short b=32767;
char c=65535;
int d=2147483647;

//变量当操作数
short e=a+1;            //报错:java: 不兼容的类型: 从int转换到short可能会有损失
                        //编译器不知道a+1结果值为128(在short范围内),值运行阶段才知道
short e=(short)a+1;     //正确

//超出范围
long f=2147483648;		//报错: 过大的整数: 2147483648(超出int的范围)
byte k=(byte)150;       //结果为:-106

//强制类型转换
int g=(int)100L;		//long强制转换为int
float h=(double)3.14;   //double强制转换为float

//多种类型参与运算
int j=10.0/5;			//java: 不兼容的类型: 从double转换到int可能会有损失
                        //原理:先将5转换成double类型后再做运算,结果是double