2.数据类型和运算符
1 标识符
总的命名规则:见名知意。如果有多个单词组成,首单词小写,其余单词的首字母大写(驼峰命名法)。Eg:goodName
1.首字母只能是字母,下划线和$(美元符)
2.其余字母可以字母,下划线,$和数字组合
3.不能使用预留关键字
4.严格区分大小写
2 数据类型
Java变量是程序中最基本的存储单元,变量名必须是合法的标识符。Java是一种强类型语言,每个变量都必须声明其数据类型,只有在变量声明以后,才能为其分配相应长度的存储单元。(先声明,后赋值(初始化),再使用)变量声明是一条完整的语句,因此每一个声明都必须以分号结束。
变量声明 : 数据类型 变量名 [= 值]
float pi = 3.14 ;(×)
float pi = 3.14f ;(√)
eg : int r = 2;
float s = pi*r*r;//计算面积
System.out.println("圆的面积为:"+s);
数据类型分为基本数据类型(8种)和引用数据类型,引用数据类型包括:类,接口,数组。
Java 语言整型常数的三种表示形式:
十进制整数,如:99, -500, 0。
八进制整数,要求以 0 开头,如:015。
十六进制数,要求 0x 或 0X 开头,如:0x15 。
3 基本数据类型
类型: byte 1个字节(8位) -128~127
short 2个字节(16位) -32768~32767
int 4个字节(32位) -2^31~2^31-1(大约21亿)
long 8个字节(64位) -2^63~2^63-1
* Java中带小数点的常量默认为double类型,(在值得后面+f/F,代表float类型)
* byte,short,int之间如果进行算数运算,结果会自动转为int类型。
12314668789213(整型常数)默认为int类型,如果声明一个long类型的变量,要在为其赋值时需要在数字后+“l/L”
eg:long a = 555;(√ 在int范围内)
long p = 1111111111111235456L(√)
float类型:单精度类型,尾数可以精确到7位有效数字,在很多情况下,float类型的精度很难满足需求。
Double类型:双精度类型,表示这种类型的数值精度是float类型的两倍,绝大部分应用程序都采用double类型。
java 浮点类型常量有两种表示形式:十进制数形式,科学记数法形式。
eg : float f = 3.14f; double d = 3.14;
print(f==d);//值相同,但精度不相同,结果就不相同,所以结果为假(false)
单引号用来表示字符常量。例如‘A’是一个字符,它与“A”是不同的,“A”表示含有一个字符的字符串(双引号)。
char 类型用来表示在Unicode编码表中的字符。
Unicode编码被设计用来处理各种语言的所有文字,它占2个字节,可允许有65536个字符;ASCII码占1个字节,可允许有128个字符,是Unicode编码表中前128个字符。
boolean类型只有两个值,true和false,主要用于判断逻辑条件。
4 Scanner:扫描器
常量:程序在运行过程中不能对其重新赋值,在java中使用final修饰的变量就是常量,只能被初始化一次。
常量的命名规则: 使用大写字母,如果有多个单词组成,中间使用_连接。
final double PI=3.14;
final int MAX_VALUE=10;
除java.lang包下的类使用时不需要导包外,其他包下的类在使用时需要导包。
通过java.util.Scanner类可以获取用户输入的内容。
使用步骤:
1.使用import关键导入包,import语句放在类的声明上面(第一行语句);import java.util.Scanner;
2.创建Scanner对象 类名 对象名 = new 类名(参数);
Scanner aaa = new Scanner(System.in);
3.使用Scanner中方法获取用户输入
对象名.方法名();
scanner.nextInt()--->获取用户输入的int类型的值
scanner.nextFloat()--->获取用户输入的float类型的值
scanner.nextDouble()--->获取用户输入的double类型的值
scanner.next()--->获取用户输入的string类型的值
scanner.nextLong()--->获取用户输入的long类型的值
eg : String name = aaa.next();--->获取用户输入的字符串
5 运算符
Java 语言支持如下运算符:
算术运算符: +,-,*,/,%,++,--
关系运算符: >,<,>=,<=,==,!=
逻辑运算符: &&,||,!,&,|,^
位运算符: &,|,^,~ , >>,<<,>>> (了解)
条件运算符 ?:
赋值运算符 =
复合赋值运算符:+=,-=,*=,/=
位运算符:~ -- 取反 & -- 按位与
| -- 按位或 ^ -- 按位异或
<<:左移运算符, >>:右移运算符 >>>:无符号移位运算符
>>右移一位相当于除2取商。a>>3---a/3/3/3
<<左移一位相当于乘2。a<<4---a*2*2*2*2
左移或右移是使用CPU中寄存器进行运算符,其运算效率是最高。
int a=1;
int b=0;
int c=2;
//System.out.println(~a);//补码
System.out.println(a&b);//0
System.out.println(a|b);//1
System.out.println(a^b);//1
//计算2^3=?使用效率最高的算法 --->System.out.println(c<<2);//
优先级:1 ()括号的优先级最高
2 算数运算符>关系(比较)运算符>逻辑运算符>条件运算符>赋值运算
eg : !(非) > &&(与) > ||(或)
整数运算:
如果两个操作数有一个为Long, 则结果也为long
没有long时,结果为int。即使操作数全为shot,byte,结果也是int.
浮点运算:
如果两个操作数有一个为double, 则结果为double.
只有两个操作数都是float, 则结果才为float.
&和&&的区别:
1.短路与&&如果左边为false,右边不再做运算。
逻辑与&在任何条件都将运算所有的条件
2.&可以做位运算
字符串连接符:
“+”运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后再进行连接。
int c = 12;
System.out.println("c=" + c);
6 i++和++i的异同之处
共同点:
1、i++和++i都是变量自增1,都等价于i=i+1
2、如果i++,++i是一条单独的语句,两者没有任何区别
3、i++和++i的使用仅仅针对变量。 5++和++5会报错,因为5不是变量。
不同点:
如果i++,++i不是一条单独的语句,他们就有区别
i++ (+在后,先输出赋值,再自加)
eg :
++,--如果放在操作数前面,先执行的自加或自减,后输出
++,--如果放在操作数后面,先执行的输出,后自加或自减
int num = 5;
System.out.println("num++ ="+num++);//==>输入5 ,num=6
System.out.println("++num ="+(++num));//==>输入7,num=7
System.out.println("num-- ="+(num--));//==>输入7,num=6
System.out.println("--num ="+(--num));//==>输出5,num=5
System.out.println("num--+num++ ="+(num--+num++));//==>输出9 ,num=5
System.out.println("--num+++num ="+(--num+(++num)));//==>输出9
7 类型转换
A.自动转化 i两种数据类型要相互兼容
ii目标类型要大于源类型(小的向大的自动转化)
byte-->short-->int-->long-->float-->double
多种类型转化,结果为范围最大的,long--》float过程精度可能会丢失
B.强制转化 会出现精度的丢失,甚至会出现数据的失真
语法:(数据类型)表达式或变量;
eg :double f =3.14;
int i = (int)f;--->i=3