Java基础知识(二)



5、变量
(1)变量概述 :在程序执行的过程中,在某个范围内其值可以发生改变的量 ;
(2)理解:如同数学中的未知数 变量定义格式 数据类型 变量名 = 初始化值;
(3)注意:格式是固定的,记住格式,以不变应万变。
(4)定义变量的注意事项:
    1、作用域
变量在同一个大括号内有效,出了大括号外无效。
2、相同的作用域中不能定义两个同名变量。
3、没有初始化值不能直接使用,在使用之前赋值即可
定义变量的格式:
1、数据类型 变量名 = 初始化值;(推荐使用第一种,今后很有可能你忘了赋值)
2、数据类型 变量名;
变量名 = 初始化值;
4、不建议在一行上定义多个变量,强制定义一个变量为一行。
       
6、数据类型和类型转换
 (1)据类型:
基本数据类型
整数类型 占用字节数 可表示的范围
byte 1 -2^7 ~ 2^7-1
short 2 -2^15 ~ 2^15-1
int 4 -2^31 ~ 2^31-1
long 8 -2^63 ~ 2^63-1
浮点类型
float 4 -3.403*10^38 ~ 3.403*10^38
double 8 -1.798*10^308 ~ 1.798*10^308
字符型
char 2
布尔型
boolean 1
引用数据类型(放到面向对象的时候说)

(2)注意事项:
1、整数默认是int类型
2、如果要定义一个long类型的数据,末尾要加上L或者l,推荐L
3、小数默认是double类型
4、如果要定义一个float类型的数据,末尾要加上F或者f,推荐F
        //定义一个int类型的变量
//定义变量的格式:数据类型 变量名 = 初始化值;
int i = 10;

//定义一个byte类型的变量
byte j = 20;

//定义一个short类型的变量
short a = 100;

//因为10000000000超过了int的数据类型范围
int b = 10000000000;

//如果要定义一个long类型的数据,末尾要加上L或者l,推荐L
long l = 10000000000L;

//定义一个float类型的数据
float f = 10000000000.0F;

//定义一个double类型的数据
double d = 12.34;

//定义一个char类型的数据
char c = 'a';
char c1 = 'abc';

//定义一个boolean类型的数据
boolean b2 = true;
boolean b3 = false;

(3)数据类型转换:
1、 +一般情况下,做加法运算。
2、 boolean类型的变量不能赋值给其他数据类型
3、默认转换
byte,short,char—int—long—float—double
byte,short,char相互之间补转换,他们参与运算首先转换为int类型
4、强制类型转换的格式:
目标数据类型 目标变量名 = (目标数据类型)要进行赋值变量
不建议大量使用强制类型转换,因为可能会损失精度。
(4)面试题:
byte b1=3,b2=4,b;
b=b1+b2;
b=3+4;
哪句是编译失败的呢?为什么呢?

(5)变量相加和常量相加不一样:
1、变量相加首先会提升数据类型,然后再相加赋值,如果接收的数据类型范围小于计算结果后的数据类型范围,报错,不能赋值
2、常量相加,会先进行计算,计算完后看看在不在接收的数据类型范围内,如果在,直接赋值,如果不在,报错。

(6)问题:
byte b = 130;有没有问题?如果我想让赋值正确,可以怎么做?结果是多少呢?
有问题的,因为byte数据类型的范围是在-128~127之间,而130超出了范围。

*/
public class DataTypeDemo5 {
public static void main(String[] args) {
// byte b = 130;

byte b = (byte)130;
System.out.println(b); // -126
b = (byte)131;
System.out.println(b);

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

/*
我们知道数据在计算机种运算的时候是采用补码的形式参数运算的,所以要知道130的补码
而想要知道补码,就得知道反码,原码,所以得求出130的二进制的表示:
130的二进制:10000010
由于整数默认是int类型,所以扩大字节
130的原码为:00000000 00000000 00000000 10000010
又由于最高位是0,所以它的原码,反码,补码都一样
130的补码:00000000 00000000 00000000 10000010
做截取操作:10000010 这是补码

已知补码,求原码:
符号位 数值位
补码: 1 0000010
反码: 1 0000001
原码: 1 1111110

最终结果为:11111110
将它换算成十进制就是我们看到的结果:-126
7、运算符

    

(1)运算:
    对常量和变量进行操作的过程称为运算。

(2)运算符:
对常量和变量进行操作的符号称为运算符

(3)操作数:
    参与运算的数据

(4)表达式:
用运算符把常量或者变量连接起来符号并且符合java语法的式子就可以称为表达式。
不同运算符连接的式子体现的是不同类型的表达式。

(5)算术运算符:
+,-,*,/,%,++,--
(6)+号的用法:
1、当加号两边都是数字或者是数字和字符的时候,这时候的+号做的是加法运算
2、当加号两边其中是字符串的时候,做的是字符串拼接,拼接后是一个新的字符串
3、字符串与任何数值做加法,做的是字符串拼接,拼接后是一个新的字符串
(7)++:自加1
当++在前的时候,先自加1,再做赋值操作,当++在后的时候,先做赋值操作,再做自加1

(8)--:自减1
当--在前的时候,先自减1,再做赋值操作,当--在后的时候,先做赋值操作,再做自减1
(9)赋值运算符:  = , +=, -=, *=, /=, %=
其中我们一直在使用的也是最常用的:=

(10)运算符总结:
算术运算符:+,-,*,/,%
赋值运算符:=,+=,-=,*=,/=,%=
比较运算符:==,>,<,>=,<=,!=
逻辑运算符:&,|,^,!,&&,||
位运算符:&,|,^,~,<<,>>,>>>
三目运算符:(关系表达式)?表达式1:表达式2;
(11)
short s=1, s = s+1;
short s=1, s += 1;
上面两个代码有没有问题,如果有,那里有问题
第一个有问题,因为变量参与运算,首先会提升数据类型,然后做运算。所以 s = s+1;s会提升到int类型然后再做加法运算,最终的
结果是int类型,所以拿short类型接收会报错,所以要想成功赋值,就得强制类型转换。
第二个代码没有问题,是因为内部自动包含了强制类型转换,s+=1 ===> s = (s的数据类型)(s+1)
(12)
 关系运算符:
==,!=,>,<,>=,<=

注意事项:
1、关系运算符的表达式的结果是一个boolean类型,要么是true,要么是false
2、==不能少写,一个=是赋值运算符,==才是关系运算符
3、赋值的时候要注意类型问题,关系运算符表达式的结果是boolean类型,所以接收的时候只能是boolean类
(13)
 逻辑运算符:
&,|,^,!,&&,||

逻辑运算符的两边放的是boolean类型的值,计算的结果也是一个boolean类型的值

&: 参与运算的时候,两边有false,则false,两边都做运算
|: 参与运算的时候,两边有true,则true,两边都做运算
^: 参与运算的时候,相同为false,不同为true,两边都做运算
!: 将true变成false,false变成true
&&: 短路与,结果和单个与结果一样,有false则false,但是执行的东西不一样,
当&&左边的表达式结果为false的时候,结果是false,右边不执行
||: 短路或,结果和单个或结果一样,有true则true,但是执行的东西不一样,
当||左边是true的时候,右边不执行,结果是true.

逻辑运算符用于连接布尔型表达式,在Java中不可以写成33 & x<6
(14)
三目运算符:又称之为三元运算符
格式:(关系表达式)?表达式1:表达式2;
如果关系表达式的结果为true,运算后的结果是表达式1;
如果关系表达式的结果为false,运算后的结果是表达式2;

注意事项:
1、三目运算符表达式的结果数据类型由三目运算符表达式1和表达式2中最大的数据类型决定的。
2、关系表达式一定只能是boolean类型
(15)
位运算符:
<<,>>,>>>,&,|,^,~
位运算符:
<<: 左移,二进制左移,右边用0补齐,多出来的丢弃
>>: 右移,最左边最高位是0用0补齐,最高位是1就用1补齐,多出来的丢弃。
>>>: 无符号右移,无论左边最高是0还是1,都用0补齐,多出来的丢弃。