下面说一个程序中随处可见的东西:变量
1.变量:
变量是JVM在内存中开辟的一个空间.用来存储数据.
变量拥有一套自己的命名规则:
1.只能由字母,数字,下划线,$构成,需要注意数字不能开头.
2.命名当然可以使用汉字,但是不建议使用.
3.严格区分大小写.
4.驼峰命名法,即变量名第一个单词首字母小写,其后的单词首字母都要大写.
5.做到见名知意,否则一段时间后就会忘了这个变量的作用.
6.不能使用关键字做变量名(public等.)
也拥有使用规则
1.由于JAVA是强类型语言,,所以定义变量时必须先声明和初始化:
int num=1;
2.可以多次进行操作.
int num=1;
num=num+1;
3.作用域:从被定义开始,到所在大括号结束,超出作用域则需要重新定义.
for(int i=0;i<5;i++){
/*
这个大括号内就是变量i的作用域,超出范围则需要重新定义.
*/
}
i+1;//此处已经超出作用域,若要使用需要重新定义.
上面的内容及代码中多次提到了一个"int",这个"int"就是数据类型了.
2.数据类型
数据类型分两种:基本数据类型和引用数据类型,上面的int就属于基本数据类型中的一种.
基本数据类型分八种,八种里面又可以细分为四类.
1.整数型:byte,short,int,long.
2.浮点型:float,double.
3.字符型:char.
4.布尔型:boolean.
下面分别做一个介绍.
整数型
顾名思义,都是用来定义整数的类型,共有四种,对应的二进制第一位表示正负(0为正1为负)
byte:字节型,不是很常用,在内存中占8位内存空间,范围-2^7到2^7-1(-128到127).
short:短整型,不是很常用,在内存中占16位内存空间,范围-2^15到2^15(-32768到32767).
int:整型,很常用,在内存中占32位内存空间.范围-2^31到2^31-1(-2147483648~2147483647).
long:长整型,很常用,在内存中占64位内存空间.范围-2^63到2^63-1(-9223372036854775808~9223372036854775807).
关于封闭式运算:
此时利用int最大值2147483647与最小值-2147483648作如下运算:
int value1=2147483647+1;//int的最大值
int value2=-2147483648-1;//int的最小值
long value3=9223372036854775807+1;//long的最大值
long value4=-9223372036854775808-1;//long的最小值
System.out.println("value1="+value1);
System.out.println("value2="+value2);
System.out.println("value3="+value3);
System.out.println("value4="+value4);
运行之后可以发现输出结果为:
value1=-2147483648
value2=2147483647
value3=-9223372036854775808
value4=9223372036854775807
这个现象可以利用二进制运算来解释:
这里用一个式子展示一下原理.
01111111 11111111 11111111 11111111 →2147483647的二进制
+00000000 00000000 00000000 00000001 →1
----------------------------------------------------
10000000 00000000 00000000 00000000 →-2147483648的二进制.
由于第一位二进制要表示正负(0为正1为负),所以实际表示数字的只是后面31位,而加一之后第一位变成1,整体变为负数,就变成了int的最小值.
浮点型
顾名思义就是表示小数的,范围比整型大了很多很多.
float:单精度浮点型,常用,在内存中占32位空间,范围-3.403E38~3.403E38.
double:双精度浮点型,常用,在内存中占64位空间,范围-1.79E308~1.79E308.
关于浮点数的精度
此时将数字:1.1234567890123456789分别存入float变量与double变量中.
float m=1.1234567890123456789f;//如果不加这个f编译会报错.
double n=1.1234567890123456789;
System.out.println("m="+m);
System.out.println("n="+n);
运行之后查看结果:
m=1.1234568
n=1.1234567890123457
可以看到两者都有不同程度的精度损失,而且可以看到double的精度是float的二倍.
字符型
只有一个类型:char,常用,在内存中占16位空间.
注意事项:
1.若想使用它,应该使用单引号将其包括在内,单引号内有且只能一个字符.
char c='c';
2.其实char类型底层为无符号二进制整数类型,每一个数值都有一个对应的字符,JAVA默认采用的是Unicode字符集.
基于第二点,我们可以做如下实验:
char c=20013;
int num='一';
System.out.println("c:"+c);
System.out.println("num:"+num);
查看运行结果:
c:中
num:19968
由此可知char可以与不超过范围的整数相互转化,由此也可以查看某个字符对应char的哪一个数值,也可以一个整数对应哪个字符.
布尔型
只有一种:boolean,只有两个值:true和false,占用8位内存空间,用来表示判断条件的真或者假.
引用数据类型
这里只说一下字符串(String)类型.
String与char有什么不同呢?
1.String需要用双引号来定义,而char是单引号.
2.String双引号内可以有任意数量的字符(0~多个),可以是空格,也可以是null.而char单引号内只能有一个字符.
如果我们需要将一种数据类型转换为另一种,就要利用类型转换了.
类型转换
分为两种:隐式转换和显式转换.
1.隐式转换
又称为自动转换,是将占用内存小的类型转换为占用内存大的类型.如:
byte a=2;
int i=a;//在前面自动添加24个0(二进制).
2.显式转换
又称为强制类型转换,是将占用内存大的类型转换为占用内存小的类型,所以有可能造成精度损失.如:
int a=1;
byte a1=(byte)a;//←等号右侧加占用内存小的类型
数学中有四则运算,JAVA中也有各种运算,此时就需要使用运算符来进行操作了.
运算符
分以下几类:
1.算术运算符: +,-,*,/,%,++,--
2.关系运算符: >,<,<=,>=,!=,==
3.逻辑运算符: &&,||,!,&,|
4.赋值运算符: =
5.拼接运算符: +
6.三元运算符: ?:
算术运算符
加减乘除跟数学里面一样,这里说一下%,++,--.
%在JAVA中是取余的意思:做除法运算时,商n余m,结果为m.
常用于判断某一个数能否被另外一个数整除.
整数取余时,结果是精确值,
浮点数取余时,余数不一定是精确值,可能会有误差.
被除数为正除数为负取余结果为正;
被除数为负除数为正取余结果为负.
++,--是自增自减符号,
1.++a,a++代表a自增1,--a,a--代表a自减1,符号与变量之间不能有空格,此时变量的值一定会+1或者-1
2.在与其他符号连用时,,
需要考虑表达式的值.++a,a++,--a,a--整体视为表达式.
符号在前,先运算再赋值:变量先自增自减.再赋值给表达式.
符号在后,先赋值再运算:先把变量的值赋给表达式,变量再自增 自减.
关系运算符:
主要用途是判断两边的条件是否成立.这里说一下!=,==与=的区别.
!= :叫做不等于,!在这里有非的意思.
==叫做等于,而=叫做赋值符号,应该注意区分.
逻辑运算符
有两个及以上的条件需要判断时,就需要使用逻辑运算符.
&&,&代表两边全是true才返回true,有一个false则返回false.
||,|代表两边有一个true就返回true,只有全部为false才返回false.
!代表条件的否定.
那么单个的&,|与成对的&&,||有什么区别呢?这里涉及到就短路运算符了.
短路运算符
成对的(&&,||)在做判断时,若前面的条件已经可以决定整体的结果时,就不需要判断后面的条件了
&&在前面的条件为false时,后面的结果无论是什么整体就都是false,就不需要判断后面的条件了.
||在前面的条件为true时,后面的结果无论是什么整体就都是true,就不需要判断后面的条件了.
而单个的(&,|)就没有这种短路效果.
赋值运算符
这里说一下+=,-=,*=,/=,%=.这些符号可以用一个式子来解释:
a+=10,等效于a=a+10.
拼接运算符
用来拼接字符串,只要前后有一个是字符串类型,整体的结果就是字符串类型.如:
String str1="12";
int num1=15;
int num2=12;
System.out.println("str1+num1="+str1+num1);
System.out.println("num1+num2="+num1+num2);
运行程序,可以看到输出结果为:
str1+num1=1215
num1+num2=27
即使字符串定义的是数字,也无法通过+进行加法运算,而是进行了拼接操作.
三元运算符
结构: 变量=条件表达式?值1:值2
解读:条件为true,变量为值1,条件为false,变量为值2.
变量的类型需要与值1或值2的类型相同,
而值1与值2的类型要么相同,要么可以自动转换
举个例子:
int num1=15;
int num2=12;
int a=num1>num2?num1:num2;
System.out.println("a=");
运行后的结果为
a=15
这种运算符可以嵌套使用.