Java数据类型转换变量运算符

1. 数据类型转换

1.1. 数据类型回顾,及什么是数据类型转换

1.1.1. 基本数据类型

byte  short   char  int   long    float   double  boolean

1.1.2. 引用类型数据

String,  枚举 , 数组 ,接口,枚举

1.1.3. 基本数据和引用类型数据的区别

1.基本数据类型变量:  存的是值的本身

2.引用类型数据变量:  存的是对值的引用[ 地址值 ]

1.1.4. 什么是数据类型转换

数据类型的转换:数据的类型转换,比如整数10转换成小数10.0

1.1.5. 为什么要进行数据类型的转换

为了节省空间大转小

Web前台传的都是字符串数据,如果后台需要运算,得转换

 

1.2. 数据类型转换的基本认识

  • 1.整型数据【值】 : 默认类型为int类型 :例如:12默认为int类型
  • 2.小数数据 : 默认为double类型 :例如:3.14默认为double类型

 

  • 1.自动类型转换:小数据类型转大数据类型【存储空间的大小】 小转大
  • 2.强制类型转换: 大转小

 

  • 1.大数据类型转小数据类型[存储空间大小]
  • 2.相同存储空间不同类型表达值范围不一样[例如:char及short

 

1.3. 数据转换图例说明

  1. Java中,boolean类型与所有其他7种类型都不能进行转换。(byte short int long float double char)
  2. 如下7种数据类型,它们之间都可以进行转换,但是可能会存在精度损失或者其他一些变化:

byte àshort ,char à int  àlongà floatà  double

 

  1. 自动类型转换:  [shortchar ,因值的范围不同,不能自动转换]其他都可以自动完成转换
  2. 强制类型转换:  必须强制转换。

思考:

为什么float 在long 后面?

小数(浮点数) 的存储方式,结构和整数不一样:知道就好无须深入研究..

1.4. 自动转换

1.4.1. 数据类型过长 溢出

byte b = 128;//超出byte范围

long intMax = int最大数(查jdk文档)

1.4.2. long  float  double只要两个操作数中有一个是上面类型的,另一个就会被转换成相应类型,并且结果也是该类型: 例如

int  num = 10;

double b = 10.01;

double  c = num + b;

System.out.println(c);

 

1.4.3. 如果2个操作数(包括byte,short,char,int),都将会转换为int类型,并且结果也是int(自动向上转型)

short s = 10;

int num = 20;

int n = num + s;

System.out.println(n);

 

byte b=3;     

b=(byte)(b*3);//必须声明byte。

System.out.println(b);

 

1.4.4. char类型向更高长度类型(例如整型)转换时,会转换为对应的ASCII码值,再做其他类型的自动转换

例如:

char  c = 'A';

int num = 10;

int a = c+num;

System.out.println(a);                           

需要注意的是:

  1. char型具有两个字节,其数值范围是0 ~ 2^16-1
  2. short类型也具有两个字节,其值的范围是-2^15 ~ 2^15-1

这直接导致byte型不能自动类型提升到char,char和short直接也不会发生自动类型提升(因为值范围问题),同时,byte当然可以直接提升到short型。

 

所以,char 不能和byte short 相互自动转换

 

1.4.5. 特例 :只看类型不看值

示例1:

int a = 129;

byte b = (byte)a;//编译器只看容器不看值

System.out.println(b);//结果为-127

示例2:

byte  b  =  100;//可以自动转换

float   f = 1.3;//不能自动转换

int  a = 2147483647;

a = a+1;

System.out.println(a);  // 结果为  -2147483648

 

1.5. 强制转换

1.5.1. 强制类型转换的语法

  1. 数据类型 变量名 = (数据类型);//值可能是更高的类型

1.5.2. 强制类型转换的注意事项

  1. 高转低会导致精度丢失,不同类型的强制转换,可能会导致精度的下降.
  2. 实际开发中:应该要知道被强制转换的数据,是在一个已知的范围;

1.5.3. 示例

比如说:double 转 float  

示例一

int i1=123;

int i2=456;

float f1 = (float) ((i1+i2)*1.2);//容量大的类型转换为容量小的类型时,要加上强制转换符

示例二:

short i=99;

char c=(char)i;  

System.out.println(c);  

 

示例三:

byte b1=1;

byte b2=2;

byte b3=(byte)(b1+b2); //byte,short,char在计算时首先转换为int,大容//量(int)转换为小容量的类型(byte)时要加强制转换

 

 例:

byte t = 127;//不报错

int a = 127;//需要强制转换才不报错:编译器只看容器【只看类型】不看值

byte b = (byte)a;System.out.println(b); // 结果为 127

2. 常量[掌握]

2.1. 什么是常量

  1. 常量就是一个固定不变的量(或者值)已知的值。例如 123,45,1.2,false等。

2.2. 常量的的分类

  1. 整数常量     例如:100 200  600L
  2. 小数常量     例如:1.3   2.5   2.1F
  3. 字符串常量   例如:”你好” “我也是醉了”
  4. 字符常量     例如:A
  5. 布尔常量     例如:true false

 

上面的5中表示形式的常量都可以直接放在打印语句中打印

3. 转义字符

3.1.  什么是转意符

Java规定特殊符号具有特殊意义,实现特殊目的的符号

3.2. 常见转意符

  1. \r 表示接受键盘输入,相当于按下了回车键;
  2. \n 表示换行;
  3. \t 表示相当于Table键制表符,
  4. \b表示退格键,相当于Back Space键;
  5. \' 表示单引号;
  6. \'' 表示双引号;
  7. \\ 表示一个斜杠\

4. 变量[重点掌握]

4.1. 引入

4.1.1. 举例:

  1. 变量比作是酒店的房间,
  2. 需存储的数据就比作要住宿的客人
  3. 我们可以根据客人的要求安排其入住“标准间”或者是“总统套房”,
  4. 并且可以根据房间名字快速查找到入住客人的信息。

4.1.2. 同理,

Java 程序中,我们也可以根据所需要保存的数据的格式,将其保存在指定类型的变量空间中,并且通过变量名快速定位!

  

4.2. 什么是变量

官方概念:在计算机内存区域分配了一个内存地址,计算机中的一个存储空间

通俗一点:变量可以看成是一个容器。我们对容器的概念就是它的作用是能够装一个东西。

4.3. 变量的语法

需求 假设现在有一份数据是整型数据 18,希望使用一个变量存储起来,怎么做?

  1. 必须获得一个变量容器(声明 或者定义一个变量),整型数据需要存入变量中

语法格式:

  1. 先定义后赋值

数据类型 变量名

变量名 = 值;

  1. 定义的同时赋值

数据类型 变量名 =  值;

4.4. 变量的注意事项及特点:

  1. 此处的数据类型可以是Java中支持的所有的数据类型!
  2. 数据类型限定了变量可以存值的类型
  3. 赋值使用的  =  号,从右往左赋值
  4. 规范写法:= 两边都加上一个空格
  5. 变量一旦定义好了,可以反复使用
  6. 变量只可以存一次值,下次存值会覆盖上一次的值

示例:

int age = 18;

System.out.println(age+69);

注意:

变量把值进行传递(后面讲了    方法   后大家再去进一步了解)

记住一点,我们在使用变量的时候其实关心的还是变量盒子中的数据,变量仅仅是一个载体而已。

4.5. 变量分类

4.5.1. 成员变量     

  1. 直接声明在类结构体中的变量;可以放在方法的上面 ,也可以放在下面

主方法使用static修饰,静态的区域,如果打印成员变量报错:

 

 

  1. 怎么解决上面问题?

把主方法的static 去掉(但是找不到主方法)

成员变量age也使用static 修饰

 

  1. 特点:

成员变量如果没有赋值,那么系统会分配默认值(不同的数据类型有不同的默认值,这点请参考数据类型);

4.5.2. 局部变量:

  1. 直接声明在方法内部,比如main方法的形参 或者 大括号中
  2. 特点:使用之前必须初始化值,不存在默认值

4.6. 作用域范围:

4.6.1. 作用域详解

  1. 成员变量:在整个类中都可以使用
  2. 局部变量:在局部的大括号中可以使用,外部或者不同区域的大括号中不可以使用
  3. 使用的变量,必须声明在使用之前。

4.6.2. 局部变量与成员变量区别

  1. 局部变量在使用之前必须得有值,试想一下一个空变量盒子你用啥呢?
  2. 成员变量系统会分配默认值(默认值意义不大)
  3. 作用域范围不同
  4. 成员变量的值,随着对象的存在而一直存在
  5. 局部变量为了辅助方法完成功能而临时存在,方法使用完毕,局部变量生命周期结束

4.6.3. 问题

  • 同一个作用域范围之内能不能够有两个名字一样的变量   为什么?       

4.7. 练习

交换2个变量里面的数据,例如 变量 a= 3;b=5; 交换后则变成:a=5,b=3;

4.8. 总结

变量是用来干啥的?变量有如下的一些特点

 

  1. 必须先声明变量再使用变量(先得有一个变量盒子,然后在拿来装东西);
  2. 每一个变量都有一个名字,方便使用;
  3. 都有一种数据类型,不同类型的变量盒子中装不同的数据;

5. 表达式[掌握]

5.1. 什么是表达式

概念:

其实就是由一系列的 常量  变量  运算符,括号()组成的一个算式,为了按照一定的运算规则计算出结果值.

5.2. 表达式示例

  1. 3+2
  2. 3+5*(2+3)

5.3. 表达式有什么用

为了按照一定的运算规则计算出结果值

结果值如何使用

  1. 结果值可以直接使用,也可以通过一个变量保存起来然后使用
  2. 表达式的结果值的类型   取表达式中操作数类型精度最高的类型

6. 运算符

6.1. 算术运算符[掌握]

6.1.1. 算数运算符的符号

  1. 加法(+)减法(-)乘法 (*) 除法(/) 取模(%)

6.1.2. 算数运算符示例

1) 整数(小数)相除的例子

2) 10/3 =3;  10.0/3=3.33333…

3) 0/0

4) 0.0/0.0  

5) 结果是NaN ,任何的NaN都不等于自己(面试题)

6) 1.0/0.0    结果:Infinity,表示无穷大

6.2. 自增自减[掌握]

6.2.1. 自增自减运算符符号

++     --

注意事项:

1) 自增自减只能够用于变量,不能用于常量  

2) 自增自减运算的优先级    算术运算符  

学习的方式:通过学习自增自然就可以知道自减

6.2.2. 基本的使用

  1. 自增运算符作用于自身

3) int  i=3;// 表示把3赋值给变量i

4) i++;    //表示变量i的值加1,i的值变成4

5) ++i;    //表示变量i的值加 1,i的值变成5

  1. 自增运算符表达式结果赋值给其他变量

1) 1.int i=3;

2) 2.int j = i++;

3) 3.i等于多少,j等于多少?

  1. 自增运算符表达式结果赋值给自身变量

1) 1.int i=3;

2) 2.int j = ++i;

3) 3.i等于多少,j等于多少?

区别:

把整个表达式看成是一个整体。

如果变量名在前面,那么整个表达式的值就是原来值不变。

如果变量名在后面,那么整个表达式的值就是原来的值加1.

6.2.3. 常见的面试题

 

int i = 3;

i = i++;

System.out.prinltn(“i = ” + i);

 

int i = 3;

i = ++i;

System.out.println(“i=” + i);

 

int i = 3;

int a = i++ + i++ + i++;

int b = ++i + ++i + ++i;

System.out.println(“i=” + i);

System.out.println(“a=” + a);

System.out.println(“b=” + b);

 

6.2.4. 练习

 

int i=5;

    i++;

    System.out.println("i="+i);//i=6

    ++i;

    System.out.println("i="+i);//i=7

    int a=++i;

    System.out.println("a="+a);//a=8

    a = a++;

    System.out.println("a="+a);//a=8

    a = ++a;

    System.out.println("a="+a);//9

 

int m = 3;

    int n = 2 * ++m;//2*4

    System.out.println("n="+n);n=8

总结

  1. 不要把单独的  自增自减    有表达式的自增自减搞混淆了

i++;

int j = i++;

  1. 一定要弄清楚计算规则,表达式的值     具体计数器的值的变化是什么

6.3. 赋值运算[掌握]

6.3.1. 赋值运算符的符号

=    +=     -=     *=     /=    %=

6.3.2. 赋值符号的运算顺序

  1. 从右到左,把符号右边的值赋值到左边的变量中
  2. 上面 后五个分别看成是一个整体: 例如 += 看成是一个符号,不要看成两个;

int i=3;

i +=2;// 表示把2 累加到变量 i 中

i -=1;

i *=3;

i /=3;

i%=3;

特例:

short s = 3;

s += 2;//存在隐式转换

short  s = 3;

s = s+2;//结果值是int,int不能自动转换为short

6.4. 比较运算符[掌握]

6.4.1. 比较运算符符号

==    !=     >  <    >=    <=    instanceof

6.4.2. 比较运算符规律

  1. 比较运算的结果是一个布尔类型的值(true false;

System.out.println(3>5);//输出结果为boolean类型

  1. 特别说明:instanceof 是判断一个对象是否属于某种类类型

思考:是否可以用于我们之前学习的基本数据类型(回忆一下我们之前学习的数据类型除了基本数据类型 还有什么?)

6.5. 逻辑运算符[掌握]

6.5.1. 逻辑运算符符号

&   |   &&   ||  ^   !

6.5.2. 逻辑运算符的作用

  1. 作用:是应用于多个条件的组合判断。//5>3>1

6.5.3. 逻辑运算符应用示例:

  1. 例如:小明参加2个学科的考试 java php  

java考了一百分并且php考了一百分,奖励欧洲十日游

伪代码描述:java==100并且php==100

java考了一百分或者php考了一百分,奖励国内十日游

伪代码描述:java==100或者php==100

6.5.4. 逻辑运算符运算规则:

&    :两边都为true ,结果为true

|    :只要有一边为true,结果为true

&&   :两边都为true ,结果为true

||   : 只要有一边为true,结果为true

^    : 两边不一样,结果为true ,否则为false,举个例子打印一下

   逻辑非,举个例子打印一下

6.5.5. &&  ||   和   & |    区别?

  1. & | 既可以充当逻辑运算,也可以是位运算符,怎么区分是逻辑运算还是位运算?

    根据表达式的结果是否为 布尔类型 来判断

6.5.6. 双与 双或  具有短路行为  什么意思?

  1. 举个例子

上面小明的考试的成绩 要求是两科都为100分,看到第一科低于100分之后没有必要再看第二科成绩   :  代码表示:Java = 100&& php = 100   (java只考了5分)

如果逻辑运算左边的值能够确定整个逻辑运算表达式的值,那么右边就不执行了,短路了。

   &&  何时短路 ?  左边表达式结果为 false

   ||  何时短路 ?  左边表达式结果为 true

 

  1. 思考:如何验证短路行为?

 

提示:

右边表达式用  自增自减,例如 ++i = 5

或者使用一个编译正常,运行报错的表达式,例如 1/0

int g = 10;

System.out.println(false&&g++ == 10);//根据&&前面的boolean值,判断后面表达式的值是否执行

System.out.println(g);

  1. 常见错误:

  例如:判断一个整数的变量 a里面的数据  在0-100之间

  正确写法 a>0   &&  a<100

  错误写法:   0<  a < 100  (java没有这种语法,不支持)

6.6. 位运算符[了解]

6.6.1. 什么是位运算

 

计算机磁盘二进制位的运算,二进制数据的运算

 

6.6.2. 位运算符号

 

&    |    ^     ~    <<  >>>>>

位运算就是 二进制的位进行运算。

示例:比如计算 125+176 ,从数学的角度是怎么计算的?

同理,位运算也类似,比如 3&4

 

可以把1看成是true,把0看成是false

  1. &  :与 位运算,两边为1,结果为1
  2. |   :或 位运算,有一个为1,结果为1
  3. ^ :  异或,两边不一样,就为1,否则为0
  4. ~ :  取反,1变成0  ,0 变成1      ~-5)结果4
  5. << :  向左位移动,例如1<<3     结果8                 
  6. >>:   向右位移动,例如8>>2        
  7. >>>:  无符号向右移动

6.7. 三目运算符[掌握]

6.7.1. 什么是三目运算符

由问号?及冒号:分割的三个表达式,组成的一个表达式如X ? Y : Z ;按照一定规则进行运算的式子,称为表达式;该表达式具有一个结果值:其中

  1. X     :布尔类型的值或者结果为布尔类型的表达式
  2. Y  Z  :一般来说数据类型相同的值或者表达式

6.7.2. 运算的规则

X 为true,就是 Y 的结果值 ( 冒号前面的表达式的值):也就是整个三目运算的结果值

X为false,就是Z的结果值 ( 冒号后面的表达式的值):也就是整个三目运算的结果值

 

注意:  

不要受  ?    和    :  的干扰,它们只是一个固定语法格式而已

 

6.7.3. 三目运算符示例

 

示例1:

找出两个整型变量中的最大值

示例2:判断一个数是 奇数 还是 偶数

示例3: 例如小明学习java 考试成绩  >=60 显示 非常优秀   否则输出 还有很大的提升空间。

posted @ 2019-09-25 15:43  超人李  阅读(394)  评论(0)    收藏  举报