Java_基础语法02_数据类型

数据类型

1.    Java是一种强类型语言,针对每种数据都提供了对应的数据类型。

2.    JAVA只有两种数据类型:基本数据类型,引用数据类型

3.    基本数据类型:8种

a)    整数:JAVA中没有无符号的整数。JAVA中整数可以表示十进制,八进制(用0开头),十六进制(用0X或0x开头)。但不能表示二进制。

i.    byte:1个字节,-27---27-1

8位带符号数

/*

byte b1 = 127;

byte b2 = (byte)128; //-128

byte b3 = (byte)129; //-127

byte b4 = (byte)130; //-126

 

byte的范围:-128 ~ 127

*/

ii.    short:2个字节,-215---215-1

16位带符号数

iii.    int:4个字节,-231---231-1,JAVA中的整数默认为int类型

32位带符号数

iv.    long:8个字节,-263---263-1,在整数的后面加L或l表示long类型的整数。

64位带符号数

b)    浮点数:浮点数的运算会产生误差

i.    float:4个字节,在浮点数后面加F或f.

32位,标准IEEE 754

ii.    double:8个字节,JAVA中浮点数默认为double类型

32位,标准IEEE 754

c)    字符类型:char,值必须放在一对单引号中,并且单引号中只能有一个字符

JAVA使用Unicode编码集,所有的字符均为2个字节,所以ava语言中的字符char可以存储一个中文汉字。

ASCII码

'a'        97

'A'        65

'0'        48

d)    布尔类型:boolean,只有两个值:true/false。JAVA中boolean类型不能转换为其它类型。占用1个字节。

class DataTypeDemo {

    public static void main(String[] args) {

        //定义变量的格式:

        //数据类型 变量名 = 初始化值;

        

        //定义一个字节变量

        byte b = 10;

        System.out.println(10);

        System.out.println(b);

        

        //定义一个短整型变量

        short s = 100;

        System.out.println(s);

        

        //定义一个整型变量

        int i = 1000;

        System.out.println(i);

        

        //超过了int的范围

        //int j = 1000000000000;

        long j = 1000000000000L;

        //long j = 100L;

        System.out.println(j);

        

        //定义浮点数据变量

        float f = 12.345F;

        System.out.println(f);

        

        double d = 12.345;

        System.out.println(d);

        

        //定义字符变量

        char ch = 'a';

        System.out.println(ch);

        

        //定义布尔变量

        boolean flag = true;

        System.out.println(flag);

    }

}

4.    变量

a)    格式:数据类型 变量名[=值];

b)    JAVA是强类型的语言。

c)    当变量没有赋值时不能使用,否则编译失败。

d)    在同一个范围内不能出现同名的变量。

e)    标识符(类名,变量名,方法名,包名等)的命名规则

i.    标识符由字母,数字,下划线,美元符组成。

ii.    不能使用数字开头。

iii.    不能使用关键字(JAVA中关键字均为小写)。

f)    Java命名规范:变量名均为小写。如果变量名由多个单词组成,从第二个单词开始,每个单词首字母大小,其它均为小写(如:userName,userAge,password)

5.    常量(最终变量)

a)    使用final关键字。

final datatype CONSTANTNAME = VALUE;

final double PI = 3.14159;

b)    从不改变的永久数据(即常量只能赋值一次)

6.    基本数据类型的类型转换

a)    基本类型比较大小:先比较精度,精度大的类型大。如果精度相同,比较字节数,字节数大的类型大。

b)    自动转换:JVM会自动将小类型转换为大的类型。

/*

byte b1 = 127;

byte b2 = (byte)128; //-128

byte b3 = (byte)129; //-127

byte b4 = (byte)130; //-126

 

byte的范围:-128 ~ 127

*/

byte,short,char -- int -- long -- float – double

long: 8个字节        -2^63~2^63-1

float:4个字节        -3.4028235E+38~3.4028235E+38

3.4*10^38 > 2*10^38 > 2*8^38 = 2*2^3^38 = 2*2^114 > 2^63-1

它们的底层存储结构不同,float表示的数据范围比long的范围要大。

c)    手动转换(强制转换):使用(类型)形式将大类型转换为小类型。精度损失问题

格式:目标数据类型 变量名 = (目标数据类型) (被转换的数据);

 

注意: boolean类型不能转换为其他的数据类型

默认转换(从小到大的转换)

A:byte,short,char—int—long—float—double

B:byte,short,char相互之间不转换,他们参与运算首先转换为int类型

//定义一个byte类型,一个int类型,做加法

byte a = 3;

int b = 4;

byte c = a + b; //这个是有问题的

int c = a + b; //可能损失精度

byte c = (byte) (a + b); //用强制类型转换改进

System.out.println((int)1.7);        //结果为1,当double型值被转换为int型值时,小数部分被截去

System.out.println((double)1/2);    //结果为0.5,因为1首先被转换为1.0,然后用2除1.0

System.out.println(1/2);            //结果为0,因为1和2都是整数,那么对他们做除法的结果也必须是整数

double d = 4.5;

int i = (int)d;        //类型转换不改变被转换的变量,d在类型转换之后值不变。

面试题:

byte b1=3,b2=4,b;

b=b1+b2;    //有问题的,是类型提升。先将b1和b2转换为int型后参与运算。

b=3+4;        //只要整形直接量是在目标变量允许的范围内,那么将整形直接量赋给short型或byte型变量时,就不需要显示的类型转换。

哪句是编译失败的呢?为什么呢?

byte b = 130;        //有问题,因为byte的范围是:-128到127。

byte b = (byte) 130; System.out.println(b);        //结果是多少呢? -126

byte b = (byte) 300; System.out.println(b);        //44

    /*

    分析过程:

        我们要想知道结果是什么,就应该知道是如何进行计算的。

        而我们又知道计算机中数据的运算都是补码进行的。

        而要得到补码,首先要计算出数据的二进制。

        

        A:获取130这个数据的二进制。

            00000000 00000000 00000000 10000010

            这是130的原码,也是反码,还是补码。

        B:做截取操作,截成byte类型的了。

            10000010

            这个结果是补码。

        C:已知补码求原码。

                    符号位        数值位

            补码:    1            0000010

            

            反码:    1            0000001

            

            原码:    1            1111110

*/                            2+4+8+16+32+64=126

思考题1:请问下面这个有没有问题

double d = 12.345;

float f = d;

float f = (float)d; //把double赋值给float,加了强制类型转换

思考题2:看看下面两个定义有没有区别呢?

float f1 = (float)12.345;    // f1其实是通过一个double类型转换过来的。

float f2 = 12.345f;        // f2本身就是一个float类型。

思考题3:

A:字符参与运算

是查找ASCII里面的值

'a'        97

'A'        65

'0'        48

System.out.println('a');

System.out.println('a' + 1);

B:字符串参与运算

这里其实是字符串的连接

System.out.println("hello"+'a'+1);    // helloa1;字符串数据和其他数据做+,结果是字符串类型。这里的+不是加法运算,而是字符串连接符。

System.out.println('a'+1+"hello");    //结果为:98hello 'a'是字符不是字符串

System.out.println("5+5="+5+5);    //5+5=55

System.out.println(5+5+"=5+5");    //10=5+5

7.    字符型char数据与数值型数据之间的转换

char型数据可以转换成任意一种数值类型。

整数转换成char类型,只用到该数据的低十六位,其余部分都被忽略。例如:

char ch = (char)0XAB0041;

System.out.println(ch);    //A

浮点型转换成char型,首先将浮点值转换成int型,然后将int型转换为char型。

char ch = (char)65.25;

System.out.println(ch);    //A

char型数据转换成数值型,字符的统一码就被转换成某个特定的数值。

int i = (int)'A';;

System.out.println(i);    //65

转换结果适用于目标变量,就可以使用隐士转换方式;否则,必须使用显示转换方式:

byte b = 'a';

int i = 'a';

因为统一码\uFFF4不适用于一个字节范围内,下面的转换就是不正确的:

byte b = '\uFFF4';

为了强制赋值,就必须使用显示转换方式:

byte b = (byte)'\uFFF4';

所有数值运算符都可以用在char型操作数上。

如果另一个操作数是一个数字或字符,那么char型操作数就会被自动转换成一个数字。

如果另一个操作数是一个字符串,字符就会与该字符串相连。

猜你喜欢

转载自www.cnblogs.com/zhaolanqi/p/9226983.html