常量是指在程序运行过程中其值不能改变的量。


常量的类型

Java中常量的分类:

    整数常量: 所有整数

    小数常量: 所有小数

    布尔常量: 只有true和false

    字符常量:使用’’引起来的单个字符

    字符串常量(String):使用“”引起来的字符序列,“”  、“a” 、”” 

    null常量: 只有一个值null


char 类型

char类型表示的是单个字符类型,任何数据使用单引号括起来的都是表示字符。字符只能有一个字符,比如:普通的人穿上军装就是军人。


转义字符的概述

转义字符

名称

Unicode

\b

Backspace (退格键)

\u0008

\t

Tab   (Tab键盘)

\u0009

\n

Linefeed (换行)

\u000A

\r

Carriage Return(回车)

\u000D

\\

Backslash  (反斜杠)

\u005C

\'

Single Quote (单引号)

\u0027

\"

Double Quote (双引号)

\u0022

\r 表示接受键盘输入,相当于按下回车。

\n 表示换行。

\t  制表符,相当于Table键

\b 退格键,相当于Back Space

\’  单引号

\’’ 双引号

\\ 表示一个斜跨


特殊字符使用”\”把其转化成字符的本身输出,那么使用”\”的字符称作为转义字符。

比如使用输出语句,打印出带引号的信息例如输出。

System.out.println("teachersaid"java is fun"");编译是无法正常通过的。语法有错误,编译器读到第二个引号就认为是字符串的结束,剩余的不知道怎么处理。如何解决这个问题:java中使用转义字符来表示特殊的字符。一个转义字符以反斜杠(\)开始。

解决方案:System.out.println("teacher said\"java is fun\"");

注意:换行符就是另起一行,回车符就是回到一行的开头,所以我们平时编写文件的回车符应该确切来说叫做回车换行符


boolean由数学家Geogore Boole 发明

boolean 类型用来存储布尔值,在java中布尔值只有2个,true和false。

boolean flag=true;

flag=false;


变量

用于存储可变数据的容器。

变量存在的意义

计算机主要用于处理生活中的数据,由于生活中存在大量的可变数据,那么计算机就必须具备存储可变数据的能力。

比如:

时间每一秒都在发生变化,根据不同的时间要有不同的处理方式。

气象站会根据温度发布天气预报信号。


变量的特点

正常情况下牛奶盒装的都是牛奶,而且会根据牛奶的多少去决定要多大的容量的牛奶盒,A和B两位同学同时把牛奶盒放进篮子里面,但是需要区分两个牛奶盒是谁的,都需要在牛奶盒上做一个标志。

1.   必须要有大小

2.   存储一定格式的可变数据

3.   必须要有名字

根据上述变量的特点,所以我们声明一个变量的时候需要确定变量的大小,类型、名字三个特点:

错误: 1024byte   temp = 1000000;

错误原因,java有自己的变量类型。 


变量的数据类型

1. 整型

  byte   代表一个字节的大小   8bit 2(8)   -128~127    256

 short  代表两个字节的大小  16bit 2(16)  -2(15)~2(15)-1

  int    代表四个字节的大小  32bit 2(32)  -2(31)~2(31)-1

  long   代表八个字节的大小  64bit 2(64)  -2(63)~2(63)-1

  如果一个数值没有采取特殊的处理,那么该整数默认的类型是int

  可以使用数值后面添加L或小写L改变默认的整数类型。

2. 浮点型

   float  代表四个字节的大小  32bit

   double 代表八个字节的大小  64bit

java程序中所有的小数默认的类型是double类型,所以需要使用特殊的符号改变默认的小数类型。

3. 字符型

   char   代表两个字节的大小  16bit 2(16)

    原理:将字符映射为码表中对应的十进制数据加以存储。

4. 布尔型

     boolean  占一个字节。只有true与false两个值。



变量的声明

格式:  数据类型  变量名字1  , 变量名字2  ,……变量名字n  ,;

例:

              int i 声明了一个×××的变量。

              double d 声明了一个double数据类型的变量

              float  f 声明了一个float数据类型的变量。

备注:变量名的首字母都一般都是以小写字母开始。


变量的初始化方式

初始化方式1: 数据类型 变量名字 = 数值。

初始化方式2: 数据类型 变量名字 , 变量名字 = 数值。

例:

         方式1: double d = 3.14;

         方式2: double d ; d = 3.14 ;


Java中这8中基本数据类型都是小写的。



 Java中可以进行不同数据类型的加减乘除运算吗?答案是可以的。在算术运算符中已经体验过如果两个整数(int)相除会去掉小数部分。如果需要保留小数部分,可以让除数或者被除数变为double类型的(5变为5.0)。其实Java是自动的将int的那个数变为了double类型了也就是Java自动的将整数变为了浮点数。例如5/2.0 其实是5.0/2.0

1、自动类型转换(也叫隐式类型转换)

可以将一个数赋值给更大数值范围的变量,例如可以经byte 变量赋值给short变量可以将short变量赋值给int变量可以将int变量赋值给long变量。

Java内部其实做了工作就是自动将数值进行了类型提升,就叫做自动类型转换(也叫隐式类型转换)

byte b = 1;  //00000001

       short s = b;  //00000000 00000001

       int i = s;

       long lon = i;

       double d  = lon; //1.0


自动类型转换(也叫隐式类型转换)

要实现自动类型的转换,需要满足两个条件,第一两种类型彼此兼容,第二目标类型取

值范围必须大于源类型。所有的数字类型,包括×××和浮点型彼此都可以进行转换。

例:

byte b=100;

       int x=b;

       System.out.println(x);//程序把b结果自动转换为int类型。


2、强制类型转换(也叫显式类型转换)

不可以将一个数值赋给范围更小数值范围的变量,除非进行类型转换。

       byte b = 100;

       b = b + 2;

       System.out.println(b);

上述例子发生了什么,发生了类型转换。

b+2 遇到了加法运算,2默认是int类型,byte类型b变量存储的值自动类型提升为

了int类型。执行完加法运算后的结果就是int类型,想要将int的类型值放入到byte类型变量b中,无法放入,编译报错。

 

       byte b=1;

       b=(byte)(b+2);

 

当两种类型彼此不兼容,或者目标类型取值范围小于源类型(目标是byte源是int)

无法自动转换,此时就需要进行强制类型转换。

 

强制类型转换需要注意:

    损失精度!!!

       int a=128;

       byte b=(byte)a;

       System.out.println(b);//-128

       /*

        * 此时的强转已经造成了数值的不准确

       */


再次分析此行代码

        byte b = 100;

        b = b + 2;

       System.out.println(b);

  编译:提示如下错误。

Java变量,常量,数据类型转换。_第1张图片

3、类型转换的原理

可以把byte 理解为1两的碗,short 2两的碗,int 4两的碗,long 8两的碗。1两碗的满碗酒可以倒入 2两 4两 8两的碗中。但是 4两碗的酒倒入1两碗的酒就有一些问题。


4、什么时候要用强制类型转换

   比如小数部分只想保留整数部分.

   一定要清楚要转换的数据在转换后数据的范围内否则会损失精度.

publicstaticvoid main(String[] args) {

       byte b = 100;

       b = (byte) (b + 2);

       System.out.println(b); // 102

        //舍弃小数部分

        double d=5.5;

       int num=(int)d;

}

 

5、表达式的数据类型自动提升

算术表达式,逻辑表达式                                   

所有的byte型、short型和char的值将被提升到int型。

如果一个操作数是long型,计算结果就是long型;

如果一个操作数是float型,计算结果就是float型;

如果一个操作数是double型,计算结果就是double型。

分析 System.out.println(‘a’+1)结果?

自动类型提升

  

byte b = 3;

       int x = 4;

       x = x + b;// b会自动提升为int类型参与运算。

       System.out.println(x);// 7

 

 

强制类型转换

 

byte b = 2;

       /*

        * 强制类型转换,强制将b+2强制转换为byte类型,再赋值给b

        */

       b = (byte) (b + 2);

       System.out.println(b);// 4

思考1

byte  b=126;

问:既然数据默认的有数据类型,那么126 默认是int类型的,为什么存储到byte类型时不会报错呢。

126 是常量java在编译时期会检查该常量(每个常量)是否超出byte类型的范围。如果没有可以赋值。

思考2:byte b=128;能否正常的编译和运行。

该语句会出现编译错误,128超出了byte变量的存储范围,所以出现编译错误。

 

思考2

byte b1=3,b2=4,b;

b=b1+b2;

b=3+4;

哪一句编译失败?为什么?

b =3+4, 3和4都是常量,所以java在编译时期会检查该常量(每个常量)是否超出byte类型的范围。如果没有可以赋值。例如b=128+1 就无法编译通过。b=127+1;也是无法通过。

b =b1+b2 不可以,因为b1 和b2 是变量,表达式求值时,变量值会自动提升为int型,表达式结果也就成了int型,这是要赋值给byte型的b,必须进行强制类型转换了。

 

6、System.out.println(‘a’+1)结果

美国人为了让计算机识别他们生活中的文字,让二进制表示生活中的文字.所以一个字母代表了一个二进制.,二进制也有十进制的表现形式.,把生活中的字母都用数字来标识,例如97 代表a ,98 代表 b。打印’a’就把a作为输出显示,没有疑问。但是 ‘a’+1 有加号涉及到了运算。根据java自动类型提升规则,同样道理 char 提升为int 。就把’a’代表的数字体现了出来。a 表示的是97 97+1就是98; 那么想要查看98 表示的char 是什么怎么实现呢 ?就要用到刚才介绍的强制类型转换了 System.out.println(char(‘a’+1));就取到了98 在ASCII码表中表示的字符。大写A 和小写a 在 ASCII有不同的表现。还有一个概念字符’1’ 在ASCII中 不是数字 1,可以运行代码查看,到此就可以明白了char 类型,char类型也是可以参与运算的,为什么可以参与运算呢。因为字符在ASCII表中都有对应的数字体现。所有的计算机兼容ASCII。

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

       System.out.println((char)('a'+1));  //b

补充问题:

       int i='a'+'b';

       System.out.println(i);//结果?     

       System.out.println("hello"+'j'); //结果?

总结:

所有数值运算符都可以用在char型数据上,如果另一个操作数是

一个数字或者字符,那么char会自动提升为int型,如果另一个

操作数是字符串,那么字符就会和字符串相连。