java笔记 1 语法基础
2.1 常量和变量
java运行时支不可以修改的数据称为常量, 有字面常量和标示符常量 变量是程序运行时值发生改变的量
2.2 数据类型
java中所有变量都必须先确定其数据类型,然后才能使用。需要在内存中开辟一个空间《明确空间类型、变量名称、数据类型》
java语言的数据类型有两种:基本数据类型和引用数据类型
基本数据类型:boolean、byte、short、int、long、char、float、double
2.3 类型转换
常见的类型转换有:赋值时类型转换;方法调用时类型转换;强制类型转换;字符串类型转换;数值类型提升。
byte b=3;
b= b+2; //错误 2位int型,b位byte型;相加是b自动提升为int型;int型的4不能赋值给byte型的b;
b=(byte)(b+2); 需要进行强制类型转换
上下文中要求类型转换时:有宽转换,窄转换,宽窄同时转换
宽转换
byte可直接转换到 short、int、long、float、double;
short可直接转换到 int、long、float、double;
char可直接转换到 intf、long、float、double;
int可直接转换到 long、float、double;
long可直接转换到 float、double;
float可直接转换到double;
窄转换
窄转换在大多情况下都会丢失信息,要求程序员自己明确指定,进行强制转换;
short可直接转换到 byte,char;
char可直接转换到 byte,short
int可直接转换到 byte,short,char;
long可直接转换到 byte,short,char,int;
float可直接转换到 byte,short,char,long;
double可直接转换到 byte,short,char,long,float;
2.4 运算符和表达式
2.4.1 算术运算符 "/"用于整数表示取整,7/2结果为3,用于float和double表示实数相除 7.0/2结果为3.5.
"%"用于整型表示取余数 -1%5=-1 1%-5=1;用于float和double表示实数取余, 15.2%5=0.2; 16.5%5=1.2
++a 先自加在进行其他运算 a++先运算在自加;
2.4.2 关系运算符 > ,>=, < ,<= ,!= ,==(等于) a==b>c等价于a==(b>c).
2.4.3 逻辑运算符 & | ! ^ && ||(ab都为false才是false)
2.4.4 位运算符 << (左移) >> (右移)
<<左移其实就是乘以2的移动的位数次幂
>>右移其实就是除以2的移动的位数次幂
>>带符号右移,高位是什么就补什么
>>>无论最高位是什么都用0补
class OperateDemo2
{
public static void main(String[] args)
{
int x = 7;
//逻辑运算符用于连接boolean类型的表达式。
//x>3 & x<6 = true & true = true;
/*
true & true = true;
true & false = false;
false & true = false;
false & false = false;
& : 只要两边的boolean表达式结果,有一个为false。那么结果就是false。
只有两边都为true,结果为true。
*/
/*
true | true = true;
true | false = true;
false | true = true;
false | false = false;
| : 两边只要有一个为true,结果为true。
只有两边都有false,结果为false。
*/
/*
^ : 异或;就是和|有点不一样。当true ^ true = false;
true ^ true = false;
true ^ false = true;
false ^ true = true;
false ^ false = false;
^ : 两边相同结果是false。
两边不同结果是true。
*/
/*
!!true
*/
int a = 2;
//a>3 && a<6;
/*
&和&&的特点:
&:无论左边是true是false。右边都运算。
&&:当左边为false时,右边不运算。
|:两边都参与运算。
||:当左边为true。右边不运算。
*/
System.out.println(false ^ false);
System.out.println(~6);
int n = 3,m = 8;
System.out.println("n="+n+",m="+m);
//1,通过第三方变量。
/*int temp;
temp = n;
n = m;
m = temp;
*/
//2不用第三方变量。
//11 = 3 + 8;
//3 = 11 - 8;
//8 = 11 - 3;
/*
n = n + m;//如果n和m的值非常大,容易超出int范围。
m = n - m;
n = n - m;
*/
n = n ^ m;
m = n ^ m;//(n^m)^m;
n = n ^ m;//n ^ (n ^ m)
System.out.println("n="+n+",m="+m);
}
}
2.5流程控制
if else 结构 简写格式: 变量 = (条件表达式)?表达式1:表达式2;
三元运算符:e1?e2:e3 e1是一个布尔型表达式 true则计算e2,否则计算e3
好处:可以简化if else代码。
弊端:因为是一个运算符,所以运算完必须要有一个结果。
if和switch语句很像。
具体什么场景下,应用哪个语句呢?
如果判断的具体数值不多,而是符合byte short int char这四种类型。
虽然两个语句都可以使用,建议使用swtich语句。因为效率稍高。
其他情况:对区间判断,对结果为boolean类型判断,使用if,if的使用范围更广。
switch(x)
{
case 3:
case 4:
case 5:
}
while(< 布尔表达式>)
{
<语句>
}
do
{
<语句>
}
while(<布尔表达式>);
while:先判断条件,只有条件满足才执行循环体。
do while: 先执行循环体,在判断条件,条件满足,再继续执行循环体。
简单一句话:do while:无论条件是否满足,循环体至少执行一次。
1,变量有自己的作用域。对于for来讲:如果将用于控制循环的增量定义在for语句中。那么该变量只在for语句内有效。
for语句执行完毕。该变量在内存中被释放。
2,for和while可以进行互换。如果需要定义循环增量。用for更为合适。
总结:
什么时候使用循环结构?
当要对某些语句执行很多次时,就使用循环结构。
2.6 递归
直接递归(方法运行时有调用了自身)和间接递归(方法运行时通过调用其他方法最终又调用自身)