2、JAVA基础语法
java基础语法:
1、关键字:被Java语言赋予了特殊含义的一些单词,Java中的关键字都是小写的。比如class int long double等
2、标识符:用户根据自己的需要定义的一些具有标识意义的符号,比如类名,函数名,数组名等。类名的每一个单词的第一个字母大写。用户自定义的变量小写。标示符由美元符号$,数字,字母,下划线。但关键字中任何字母大写了都可以用作标识符,但是尽量根据具体情况起一些有意义的标识符名字。
3、注释:java语言中三种格式的注释 //表示单行注释 /* */表示多行注释 /***/文档注释
注释作用:注解说明程序;调试程序。
注意:多行注释中不要嵌套多行注释。编译器在编译java源文件时,生成的class文件是没有注释的。
注释的应用:
学习写代码之前,先通过注释明确: 需求,思路,步骤。
对已有进行理解时,对细节代码部分进行注释说明。方便于代码的理解。
面试和开发时,一定要对自己写的代码进行注释。以体现专业性。
注释的应用养成习惯。代码是思想的体现。先有思想再有代码。
在一个公司当接到一个项目时候需要做的四件事情:1、需求分析(时间最长,也是最关键),2、项目设计,3、代码编程(目前自己就属于这个阶段的人员,必须努力),4、程序测试(对于一些大公司还会做项目评估。)
一、Java中的数据类型:
1、常量:数值不会变化的数据就是常量,也可说是固定不变的值。比如'A' 123 3.14 都属于常量值
Java中常量的分类:
1)整数常量:所有整数
2)小数常量:所有小数
3)布尔(boolean)型常量。较为特有,只有两个数值。true false。
4)字符常量。将一个数字字母或者符号用单引号( ' ' )标识。
5)字符串常量。将一个或者多个字符用双引号(“ ”)标识。
6)null常量。只有一个数值就是:null.
对于整数:有四种表现形式:二进制:0,1 ,满2进1。八进制:0-7 ,满8进1, 用0开头表示。
十进制:0-9 ,满10进1。十六进制:0-9,A-F,满16进1.,用0x开头表示。
进制的由来:任何数据在计算机中都是以二进制的形式存在的。二进制早起由电信号开关演变而来。一个整数在内存中一样也是二进制的,但是使用一大串的1或者0组成的数值进行使用很麻烦。所以就想把一大串缩短点,将二进制中的三位用一位表示。这三位可以取到的最大值就是7.超过7就进位了,这就是八进制。但是对于过长的二进制变成八进制还是较长,所以出现的用4个二进制位表示一位的情况,四个二进制位最大是15,这就是十六进制。进制越大,表现形式就越短。
2、变量:数值不确定的量就是变量,也就是说随时可以更改的量。变量有自己的作用范围。
Java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存总分配了不同大小的内存空间。
Java中的数据类型分为两大类:基本数据类型和引用数据类型。
基本数据类型有八种:
整型:byte型(1byte)、short型(2byte)、int型(4byte)、long(8byte)
浮点型数据:float(4byte)、double(8byte)
布尔型:boolean(1byte)
字符型:char(2byte)
引用数据类型:数组、类、接口
所有的整数都默认为int型,所有的浮点型数据都默认为double型
3、类型转换:自动数据类型转换和强制数据类型转换
自动数据类型转换(隐式数据类型换):所有的byte型、short型和char的值将被提升到int型。
强制数据类型转换:当使用的数据类型和准备存放的空间类型不相符,并且这个数据在当前这个空间中存放不下,但是还必须存放的时候使用强转。
案例:自动类型提升
byte b = 3;
int x = 4;
x = x + b;//b会自动提升为int类型进行运算。
强制类型转换
byte b = 3;/定义一个byte型b空间
计算机会判断右侧的这个值是否能在当前byte空间存下,若能存下就正常存放,若村不下就报错。 但是int例外。
b = b + 4;//报错 原因是计算机在内存中先将byte型的b自动提升为int 然后和4运算,运算结果为int型无法存放到byte型的b空间
b = (byte)(b+4);//强制类型转换,强制将b+4的结果转换为byte类型,再赋值给b。
byte b1=3,b2=4,b;
b=b1+b2;不可以,是因为b1和b2是变量,因为变量的值会变化,不确定具体的值,所以默认使用int类型进行存储。
b=3+4;//3和4都是常量,所以java在编译时期会检查该常量的和是否超出byte类型的范围。如果没有可以赋值。
4、算术运算符: + - * / %
如果对负数取模,可以把模数负号忽略不记,如:5%-2=1。但被模数是负数就另当别论。
对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。
例如:int x=3510;x=x/1000*1000; x的结果是? 注意当运算符两侧类型统一时结果和运算数保持一致。
5、符合运算符: = , +=, -=, *=, /=, %=
示例:
int a,b,c; a=b=c =3;
int a = 3; a+=5;等同运算a=a+5;
思考:
short s = 3;
s=s+2;//编译失败,因为s会被提升为int类型,运算后的结果还是int类型。无法赋值给short类型。
s+=2; //编译通过,因为+=运算符在给s赋值时,自动完成了强转操作。
6、自增、自减运算 ++ --
案例:
class Test2
{
public static void main(String[] args)
{
int a=3;
a++; 自增、自减谁在左边先算谁
System.out.println(a); 结果为4
int i=3;
i=i++; 需要注意,除了自增还有赋值,
因此必须是先算完右边后算左边
System.out.println(i); 结果为3
int a1=3,b1;
b1=(a1++)+(++a1)+(++a1); 3+5+6
System.out.println(a1+","+b1);
} 结果a1值6 b1值为14
}
7、逻辑运算符
逻辑运算符:比较运算符运算结果要么是true 要么是false 总结 所有运算符计算机后都会有结果。逻辑运算符运用于连接两个布尔类型的表达式
逻辑运算符用于连接布尔型表达式,在Java中不可以写成3<x<6,应该写成x>3 & x<6 。
&:与运算符的特点:
true & true = true
true & false = false
false & true = false
false & false = false
总结: &只要一边为false 结果就为false ,只有两边都为true 结果才为true
| :或、或者运算符:
true | true = true
true | false = true
false | true = true
false | false = false
总结: |只要一边为true 结果就为true ,只有两边都为false 结果才为false
^ :异或运算:
true ^ true = false
true ^ false = true
false ^ true = true
false ^ false = false
总结:两边都为结果相同为false,两边结果不同为true。
! : 非运算 : 判断事物的另一面。
总结 : 非true 为false 非false 为 true
&& :双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。
|| :双或时,左边为真,右边不参与运算。
总结:“&”和“&&”的区别:单&时,左边无论真假,右边都进行运算;双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。“|”和“||”的区别同理,双或时,左边为真,右边不参与运算。异或( ^ )与或( | )的不同之处是:当左右都为true时,结果为false。
8、关系运算(比较运算)
9、移位运算:<< | 空位补0,被移除的高位丢弃,空缺位补0。 |
>> | 被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,空缺位补1。 |
>>> | 被移位二进制最高位无论是0或者是1,空缺位都用0补。 |
& | 二进制位进行&运算,只有1&1时结果是1,否则是0 |
| | 二进制位进行 | 运算,只有0 | 0时结果是0,否则是1; |
^ | 相同二进制位进行 ^ 运算,结果是0;1^1=0 , 0^0=0,不相同二进制位 ^ 运算结果是1。1^0=1 , 0^1=1 |
~ | 0变1,1变0 |
class Test2 { public static void main(String[] args) { int a = 9 , b = 12 , c ; c=a&b; System.out.println(a+"&"+b+"="+c); c=a|b; System.out.println(a+"|"+b+"="+c); c=a^b; System.out.println(a+"^"+b+"="+c); c=~a; System.out.println("~"+a+"="+c); c=a<<2; System.out.println(a+"<<"+2+"="+c); c=a>>2; System.out.println(a+">>"+2+"="+c); c=-a>>>2; System.out.println("-"+a+">>>"+2+"="+c); c=a>>>2; System.out.println(a+">>>"+2+"="+c); } } |
有符号左移运算,相当于给原数乘以2的多少次幂(幂是位移数),有符号右移运算,相当于给原数除以2的多少次幂(幂是位移数)。有符号左移低位补零,有符号右移高位是零就补零,是一就补一。无符号右移,不管高位是什么数,统一用零来补。 9&12=8 9|12=13 9^12=5 ~9=-10 9<<2=36 9>>2=2 -9>>>2=1073741821 9>>>2=2 如何快速取出一个二进制数的后四位 给这个数&上15(1111,其余高位全部为零) 通过>>和&可以完成一个取十六进制的操作。
|
10、三元运算符:表达式1?表达式2:表达式3;三元运算符计算完后必须有一个确定的结果。
小知识:局部代码块:局部代码块,可以定义局部变量的生命周期,但这个变量不在使用的时候空间就被释放。
11、判断结构的三种基本形式:判断结构的条件表达式结果只有两种结果true和false
if语句的第一种格式:
int x = 1; if(x>1){ if(x<2){ System.out.println("yes"); } } System.out.println("over"); |
if(条件表达式)
{
执行语句;
}
if语句的第二种格式:
if(条件表达式)
{
int x = 1; if(x>1){ System.out.println("yes"); } else { System.out.println("no"); } System.out.println("Hello World!"); |
执行语句;
}
else//否则
{
执行语句;
}
if语句第三种格式:
if(条件表达式)
{
执行语句;
}
else if (条件表达式)
{
int x = 1; if(x==1){ if(y==1){ System.out.println("a"); } else { System.out.println("b"); } else{ if(y==1){ System.out.println("c"); } else{ System.out.println("d"); }}} |
执行语句;
}
……
else
{
执行语句;
}
总结:if(a>1)
b = 100;
else
b = 200;
b = a>1?100:200;//三元运算符就是if else 语句简写格式。
简写格式什么时候用? 当if else运算后,有一个具体的结果时,可以简化写成三元运算符。
案例1练习: 需求:根据用户指定的具体数据,判断该数据对应的星期。 1-星期一Monday 思路: 用户输入无法获取但是那只是具体数据的一种获取手段而已。而我们要做的功能仅仅是对用户指定的数据进行对应星期的打印而已。所以具体的数据不确定,完成可以使用变量来表示。我们只对变量进行操作即可。至于变量的值,可以有用户决定。因为数据的不确定性,所以要对数据进行判断。使用if语句。 int week = 10; if(week==1) System.out.println(week+"对应中文是星期一"); else if(week==2) System.out.println(week+"对应中文是星期二"); else if(week==3) System.out.println(week+"对应中文是星期三"); else if(week==4) System.out.println(week+"对应中文是星期四"); else if(week==5) System.out.println(week+"对应中文是星期五"); else if(week==6) System.out.println(week+"对应中文是星期六"); else if(week==7) System.out.println(week+"对应中文是星期日"); else System.out.println(week+"没有对应的星期"); } 案例2练习: 一年有四季。春季:3 4 5 夏季:6 7 8 秋季:9 10 11 冬季:12 1 2 根据用户输入的月份,给出对应的季节。 int month = 8; if(month<1 || month>12) System.out.println(month+"月没有对应的季节"); else if(month>=3 && month<=5) System.out.println(month+"月是春季"); else if(month>=6 && month<=8) System.out.println(month+"月是夏季"); else if(month>=9 && month<=11) System.out.println(month+"月是秋季"); else System.out.println(month+"月是冬季"); 第二种写法: if(month==3 || month==4 || month==5) System.out.println(month+"月是春季"); else if(month==6 || month==7 || month==8) System.out.println(month+"月是夏季"); else if(month==9 || month==10 || month==11) System.out.println(month+"月是秋季"); else if(month==12 || month==1 || month==2) System.out.println(month+"月是冬季"); else System.out.println(month+"月没有对应的季节"); |
12、switch选择语句
if: 1,对具体的值进行判断。
2,对区间判断。
3,对运算结果是boolean类型的表达式进行判断。
switch:
1,对具体的值进行判断。
2,值的个数通常是固定的。
对于几个固定的值判断,建议使用switch语句,因为switch语句会将具体的答案都加载进内存。
效率相对高一点。
int x =13; if( x>0 ){ switch( x%7 ){ case 0 : System.out.println("星期日");break; case 1 : System.out.println("星期一");break; case 2 : System.out.println("星期二");break; case 3 : System.out.println("星期三");break; case 4 : System.out.println("星期四");break; case 5 : System.out.println("星期五");break; case 6 : System.out.println("星期六");break; } } |
13、三种循环语句:while do-while for 需要注意while和for循环身后不直接加分号
int x = 1; while(x<3){ System.out.println("x="+x); x++; } |
while(条件表达式)
{
执行语句;
}
练习:获取1到10 10个数字的和。
思路:1,每次参与加法的数值不确定。
2,每次的出现的和数据也不确定。
3,发现参与加法运算的数值有递增规律。
4,每一次都是加法运算在重复,并且都是和再加上下一个数值。
步骤:
1,定义一个变量,记录住参与加法运算的数据。
2,定义一个变量,记录中每一次的出现的和。
3,对于记录参与加法运算的数据进行自增。
4,因为加法运算需要重复,就要想到循环结构。
累加思想。
int x = 1;//记录参与加法的数据。
int sum = 0;//记录住每一次的和。
while(x<=100){
sum = sum + x;
x++;
}
System.out.println("sum="+sum);
练习:
1~100之间 6的倍数出现的次数。
要求:自己独立完成思想的书写。和步骤的文字描述。
思路:
1、需要从1到100把每一个数提供出来。而这个数在不停得变化,因此需要一个变量来提供这个数。
2、每提供一个数是不是6的倍数,需要用if结果来判断。
3、当这个数能是6的倍数的时候,就需要一个空间来统计一次,而具体有多少个数是6的倍数,也不确定, 因为还一个变量来统计这个个数,即计数器
步骤:
计数器思想
int x = 1;
int count = 0;
while(x<=100){
if(x%6==0)
count++;
x++;
}
System.out.println("count="+count);
do{
执行语句;
}while(条件表达式);
int x = 1; do{ System.out.println("x="+x); x++; }while (x<1); do while语句的特点:无论条件是否满足,循环体至少执行一次。 int y = 1; while(y<1){ System.out.println("y="+y); y++; } |
for(初始化表达式;循环条件表达式;循环后的操作表达式)
{
执行语句;(循环体)
}
例如: for(int x = 1; x<3; x++)
{
System.out.println("x="+x);
}
用for完成累加。 int sum = 0; for(int x=1; x<=10; x++) { sum = sum + x; } System.out.println("sum="+sum); |
for和while的特点:1,for和while可以互换。2,格式上的不同,在使用上有点小区别。如果需要通过变量来对循环进行控制,该变量只作为循环增量存在时,此时使用for最好。
什么时候使用循环结构呢?
当对某些代码执行很多次时,使用循环结构完成。当对一个条件进行一次判断时,可以使用if语句。
当对一个条件进行多次判断时,可以使用while语句。 注意:在使用循环时,一定要明确哪些语句需要参与循环,哪些不需要。循环通常情况下,需要定义条件,需要控制次数。
循环嵌套、break和continue的用法、函数(方法)、函数重载、数组
一、循环嵌套:大全套小圈思想
for(int x=0; x<4; x++)//外循环控制的是行数
{
for(int y=0; y<5; y++)//内循环控制的是每一行的个数
{
System.out.print("*");
}
System.out.println();
}
案例1:九九乘法表 for (int x=1; x<=9 ;x++ ) { for (int y=1; y<=x ;y++ ) { System.out.print(y+"*"+x+"="+y*x+"\t"); } System.out.println(); } 补充内容:转义字符 \n:回车: \t:制表符。 \b:退格。 \r: 按下回车键 windows系统中回车符其实是由两个符号组成的 \r\n. linux中回车符是 \n. |
案例2: ***** **** *** ** * for(int x=1; x<=5; x++) { for(int y=x; y<=5; y++) { System.out.print("*"); } System.out.println(); } 规律:随着行数的递增列数在递减,这个时候可以通过控制内循环的初始值的方式来控制内循环。 * ** *** **** ***** for (int x=1; x<=5 ;x++ ) { for (int y=1;y<=x ;y++ ) { System.out.print("*"); } System.out.println(); } 规律:随着行数的递增列数在递增,这个时候可以通过控制内循环的结束值的方式来控制内循环。 54321 5432 543 54 5 for (int x=1; x<=5; x++ ) { for (int y=5; y>=x ;y-- ) { System.out.print(y); } System.out.println(); } 1 22 333 4444 55555 for (int x=1; x<=5 ; x++) { for (int y=1;y<=x ;y++ ) { System.out.print(x); } System.out.println(); } } * * * * * * * * * * * * * * * for(int x=1; x<=5; x++) { for(int y=1; y<x; y++) { System.out.print(" "); } for(int z=x; z<=5; z++) { System.out.print("* "); } System.out.println(); } |
二、break和continue用法:
1、break:跳出,break作用的范围:要么是switch语句,要么是循环语句。当break语句单独存在时,下面不要定义其他语句,因为执行不到。break跳出所在的当前循环。如果出现了循环嵌套,break想要跳出指定的循环,可以通过标号来完成。
for(int x=0; x<3; x++)
{
if(x==1)
break;
System.out.println("x="+x);
}
语句标号:
xiaoqiang:for (int x=0; x<3 ;x++ )
{
wangcai:for (int y=0; y<4 ; y++)
{
System.out.println("x="+x);
break xiaoqiang;
}
}
2、continue:继续,作用的范围:循环结构。continue:结束本次循环,继续下次循环。如果continue单独存在时,下面不要有任何语句,因为执行不到。
for (int x=0; x<11 ;x++ )
{
if(x%2==0)
continue;
System.out.println("x="+x);
}
xiaoqiang:for (int x=0; x<3 ;x++ )
{
wangcai:for (int y=0; y<4 ; y++)
{
System.out.println("x="+x);
continue xiaoqiang;
}
}
三、函数(方法):
函数的书写格式:
修饰符 返回值类型 函数名(参数列表)
{
返回值;
}
1、定义函数时需要注意:
功能中只定义所需内容。不是该功能所需的内容不要定义。如果非要定义,也是单独定义一个功能来体现。 以后开发时,尽量都将功能以不同的函数来体现。不要将代码都定义在主函数中。主函数的作用是:对已有的功能的进行调用。可以理解为用于功能的测试。函数名就是一个自己定义的标示符。函数名的定义,要尽量体现出这个函数的功能。是为了增强该函数的阅读性,方便于调用者使用。所以函数名一定要有起的有意义。
2、定义函数时候需要有两个明确:
1)这个函数会得到什么结果,也就是返回值是什么。
2)有没有未知内数据参与运算。
3、函数重载什么时候使用?
重载:当需要完成某些功能相似或者相近的操作,但由于参数个数,或者参数类型不同时候可以使用函数重载。在一个类中,可以出现两个以上的同名函数。只要它们的参数个数或者参数类型不同,这就是函数的重载。
1,大圈套小圈思想,什么时候使用?
我有一种自己重复的动作,而这种情况里面有包含着另外一种往复重复的动作。这个时候就可以使用大圈套小圈的思想。
2,break,continue作用的范围和作用。
break 可以作用于switch和循环。作用是跳出switch和循环。作用范围是当前所属的switch和循环,但有标号的时候跳出标号所指的switch和循环.
continue 只能作用于循环,作用结束本次循环,接着进入下次循环(循环不会结束)。作用范围是当前所属的循环,但有标号的时候就要接着进入标号所属的循环。
3,如何理解函数?(特点,注意事项)
函数即就是方法,就是封装了某一功能的一个代码快,具有自己的名字和访问权限以及返回类型。函数里面不能再嵌套函数。同时需要注意,静态方法只能调用静态方法。
注意事项:首先函数名的书写应该规范化,见名知义。一个函数就完成当前应该完成的功能,不是它的应该完成的功能尽量不要写在这个函数内部。当调用一个函数时,不要返回任何数据的时候,此时返回值必须为void类型,不能用其他类型代替,同时也可以在函数中加入一个不带返回值的return语句。
4,怎么定义一个函数?
定义函数:根据实际问题可以进行分析,然后明确这个函数完成什么功能,会得到一个什么样的结果,以及结果应该如何处理。和函数中具体有多少未知变量参与运算。
函数定义格式:修饰符 返回值类型 函数名( 形参类型 形式参数名 , 型材类型 形式参数名 )
{}
5,函数重载什么时候使用?
重载:当需要完成某些功能相似或者相近的操作,但由于参数个数,或者参数类型不同时候可以使用函数重载。