知识点总结于毕向东Java基础视频教程25天版本,侵权请联系删除。
Java语言基础组成
关键字
定义:被Java语言赋予特殊含义的单词
特点:关键字中所有字母都为小写
标识符
-
在程序中自定义的一些名称。
-
由26个英文字母大小写,数字:0-9符号:_$组成。
-
定义合法标识符规则:
1.数字不可以开头
2.不可以使用关键字
-
Java中严格区分大小写。
-
在起名字时,为了提高阅读性,要尽量有意义。
Java中的名称规范:
-
包名:多单词组成时所有字母都小写。xxxyyyzzz
-
类名接口名:多单词组成时,所有单词的首字母大写。XxxYyyZzz
-
变量名和函数名:多单词组成时,第一个单词首字母小写,第二个单词开始每个首字母大写。xxxYyyZzz
-
常量名:所有字母都大写。多单词使用时每个单词用下划线连接。XXX_YYY_ZZZ
注释
- 用于注解说明解释程序的文字就是注释。
- 提高了代码的阅读性。
- Java中的注释格式:
1.单行注释//这是单行注释
2.多行注释/*这是多行注释*/
3.文档注释/** 这是文档注释 */
- 对于单行和多行注释,被注释的文字,不会被JVM(java虚拟机)解释执行。
- 对于文档注释,是java特有的注释,其中注释内容可以被JDK提供的工具javadoc所解析,生成一套以网页文件形式体现的该程序的说明文档。
- 注释是一个程序员必须具有的良好编程习惯。
- 初学者编写程序可以养成习惯:先注释再写代码。
- 将自己的思想通过注释先整理出来,再用代码去体现。因为代码仅仅是思想的一种体现形式。
常量与变量
常量
- 常量表示不能改变的数值。
- Java中常量的分类:
1.整数常量。所有整数。
2.小数常量。所有小数。
3.布尔型常量。较为特有,只有两个数值true和false。
4.字符常量。将一个数字字母或符号用单引号( ’ ’ )标识。
5.字符串常量。将一个或多个字符用双引号标识。
6.null常量。只有一个数值null。
- 对于整数:java有三种表现形式:
1.十进制:0-9,满10进1
2.八进制:0-7,满8进1.用0表示开头。
3.十六进制:0-9,A-F,满16进1.用0x表示开头。
变量
变量的概念:
- 内存中的一个存储区域
- 该区域有自己的名称(变量名)和类型(数据类型)
- 该区域的数据可以在同一类型范围内不断变化
为什么要定义变量:
使用变量注意:
定义变量的格式:
理解:变量就如同数学中的未知数。
类型转换
Java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存总分配了不同大小的内存空间。
数据类型 |
基本类型 |
存储单元 |
取值范围 |
整型 |
byte |
1个字节(8位) |
-128~127 |
short |
2个字节(16位) |
-32768~32767 |
int |
4个字节(32位) |
-2,147,483,648~2,147,483,647 |
long |
8个字节(64位) |
-9,223,372,036,854,775,808~9,223,372,036,854,775,807 |
浮点型 |
float |
4个字节(32位) |
-2^128 ~ 2^128 |
double |
8个字节(64位) |
-2^1024 ~ 2^1024 |
字符型 |
char |
2个字节(16位) |
0~65536 |
布尔型 |
boolean |
1个字节(8位) |
仅有两个值true, false,变量初始化默认值false |
整数默认类型:int 小数默认类型:double,
不同类型的数不能直接做运算。
例如:
byte b=2; //正确
b=b+2; //错误
- 2代表int类型的整数为什么可以直接赋给byte,但为什么第2句又错了呢?
因为编译器知道常量2在byte的合法取值范围当中,会自动转换成byte。而b=b+2错误是由于编译器无法在编译期间知晓变量的值,不确定最后得到的值会不会超过byte的取值范围,所以报错。
- 自动类型转换(隐式类型转换)
从低位类型到高位类型系统可以自动转换。
- 所有的byte型、short型和char的值将被提升到int型。
- 如果一个操作数是long型,计算结果就是long型。
- 如果一个操作数是float型,计算结果就是float型。
- 如果一个操作数是double型,计算结果就是double型。
- 强制类型转换(显式类型转换)
语法格式:(数据类型) 数值
数据在经过强制转换后可能会出现丢失精度的情况。
运算符
算术运算符
运算符 |
运算 |
范例 |
结果 |
+ |
正号 |
+3 |
3 |
- |
负号 |
b=4;-b; |
-4 |
+ |
加 |
5+5 |
10 |
- |
减 |
6-4 |
2 |
* |
乘 |
3*4 |
12 |
/ |
除 |
5/5 |
1 |
% |
取模 |
5%5 |
0 |
++ |
自增(前) |
a=2;b=++a; |
a=3,b=3 |
++ |
自增(后) |
a=2;b=a++; |
a=3;b=2 |
- - |
自减(前) |
a=2;b=- -a; |
a=1;b=1 |
- - |
自减(后) |
a=2;b=a- -; |
a=1;b=2 |
+ |
字符串相加 |
“He”+“llo” |
“Hello” |
提问:
int x=4270;
x=x/1000*1000;
System.out.println(x);//x的值是多少?
x为int型,1000默认也为int型,所以结果也是int型,则需要舍弃小数位,得到结果为4。再进行乘法运算得到x为4000。
负数的取模运算
注意:在Java语言中,负数取模运算的结果的符号只与第一个操作数的符号相同(或为0)。
连接符
字符串数据和任何数据使用"+"都是相连接,最终都会变成字符串。
System.out.println("5+5"+5+5);//"5+555"
转义字符
通过"\"转变后面字母或者符号的含义。
\n:换行
\b:退格。相当于backspace键。
\r:按下回车键。//在Windows系统中,回车符是由两个字符来表示"\r\n"。
\t:制表符。相当于tab键。
转义字符写在被转义字符的前面。
System.out.println("\"Hello World\"");
输出结果:“Hello World”(带上了双引号)
赋值运算符
- 符号:
= , +=, -=, *=, /=, %=
- 示例:
int a,b,c; a=b=c =3; int a = 3;
a+=5;等同运算a=a+5;
比较运算符
运算符 |
运算 |
范例 |
结果 |
== |
相等于 |
4==3 |
false |
!= |
不等于 |
4!=3 |
true |
> |
大于 |
4>3 |
true |
< |
小于 |
4<3 |
false |
>= |
大于等于 |
4>=3 |
false |
<= |
小于等于 |
4<=3 |
false |
instanceof |
检查是否是类的对象 |
“Hello” instanceof String |
true |
逻辑运算符
运算符 |
运算 |
范例 |
结果 |
& |
AND(与) |
false&true |
false |
| |
OR(或) |
false|true |
true |
^ |
XOR(异或) |
true^false |
true |
! |
NOT(非) |
!true |
false |
&& |
AND(短路) |
false&&true |
false |
|| |
OR(短路) |
false||true |
true |
&和&&的区别:
int a=2;
a>3 & a<6;
a>3 && a<6;
无论左边是true是false,右边都运算。
&:判断a>3为false,再判断a<6为true。
当左边是false时,右边不运算。
&&:判断a>3为false,不执行后来的判断。
"|"和"||"同理。
位运算符
运算符 |
运算 |
范例 |
<< |
左移 |
3<<2 = 12- -> 3*2*2= 12 |
>> |
右移 |
3>>1 = 1- -> 3/2= 1 |
>>> |
无符号右移 |
3>>>1 = 1- -> 3/2= 1 |
& |
与运算 |
6 & 3 = 2 |
| |
或运算 |
6 | 3 = 7 |
^ |
异或运算 |
6 ^ 3 = 5 |
~ |
反码 |
~6 = -7 |
- <<:将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。其实就是乘2的移动的位数次幂。比如将a左移一位就是a =a*2^1。
- >>:将一个数的各二进制位全部右移若干位(正数左补0,负数左补1,右边超出的二进制位丢弃)。除以2的移动位数次幂。比如将a左移一位就是a =a/2^1。
- >>>:无论最高位是什么,右移后都用0补。
- &:参加运算的两个数据,按二进制位进行“与”运算。
- |:参加运算的两个数据,按二进制位进行“或”运算。
- ^:参加运算的两个数据,按二进制位进行“异或”运算。
- ~:参加运算的一个数据,按二进制位进行“取反”运算。
练习:(1)最有效率的方式算出2乘以8等于几?
(2)对两个整数变量的值进行互换(不通过第三方变量)
(1)2<<3;
(2)如下:
方法1:
int n,m;
n=n+m;//如果n和m的值非常大,容易超出int范围
m=n-m;
n=n-m;
方法2:
int n,m;
n=n^m;
m=n^m; //m=(n^m)^m=n
n=n^m; //n=(n^m)^n=m
三元运算符
-
格式
(条件表达式)?表达式1:表达式2;
如果条件为true,运算后的结果是表达式1;
如果条件为false,运算后的结果是表达式2;
-
示例
获取两个数中大数。
int x=3,y=4,z;
z = (x>y)?x:y; //z变量存储的就是两个数的大数。
注意:类型不同的数会从低位转换到高位。
- 特点
1.可以简化if else代码;2.因为是一个运算符,所以运算结束必须返回一个结果。
程序流程控制
判断结构
- if
if(条件表达式)
{
语句;
}
- if-else
if(条件表达式)
{
语句;
}
else
{
语句;
}
- if-else if- else
if(条件表达式)
{
语句;
}
esle if(条件表达式)
{
语句;
}
else
{
语句;
}
选择结构
switch(条件表达式){
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
...
default:
语句体n;
break;
}
- switch语句选择的类型只有四种:byte,short,int ,char。
- case之间与default没有顺序。先执行第一个case,没有匹配的case执行default。
- 结束switch语句的两种情况:遇到break,执行到switch语句结束。
- 如果匹配的case或者default没有对应的break,那么程序会继续向下执行,运行可以执行的语句(不需要再次判断),直到遇到break或者switch结尾结束。
什么时候选择Switch或者If?
如果判断的具体数值不多而且符合byte short int char四种类型,建议使用switch语句,因为相比于if,switch效率稍高。
其它情况:对区间判断,对结果为Boolean类型判断使用if,if的使用范围更广。
循环结构
- while
while(条件表达式)
{
执行语句;
}
- do while
do
{
执行语句;
}while(条件表达式);
do while特点是条件无论是否满足,循环体至少被执行一次。
- for
for(初始化表达式;循环条件表达式;循环后的操作表达式)
{
执行语句;
}
注意:
- for里面的连个表达式运行的顺序,初始化表达式只读一次,判断循环条件, 为真就执行循环体,然后再执行循环后的操作表达式,接着继续判断循环条件, 重复找个过程,直到条件不满足为止。
- while与for可以互换,区别在于:for为了循环而定义的变量在for循环结束后将在内存中释放*。而while循环使用的变量在循环结束后还可以继续使用。
- 最简单无限循环格式:while(true) , for(; ; ) 。无限循环存在的原因是并不知道循环多少次,而是根据某些条件,来控制循环。
*:变量结构有自己的作用域。对于for来讲:如果将用于控制循环的增量定义在for语句中,那么该变量只在for语句内有效,for语句执行完毕,该变量在内存中释放。
其它流程控制语句
- break(跳出)
应用范围:选择结构和循环结构
- continue(继续)
应用范围:循环结构
注:
- 这两个语句离开应用范围,存在是没有意义的。
- 这个两个语句单独存在下面都不可以有语句,因为执行不到。
- continue语句是结束本次循环继续下次循环。
- 标号的出现,可以让这两个语句作用于指定的范围。如下:
标号只能应用于循环上,是给循环起名的一种方式。
w:for(int i=0;i<3;i++){
q:for(int j=0;j<4;j++){
break w; //退出名称为w的循环
}
}
for(int i=1;i<=10;i++){
if(x%2==1)continue;
System.out.println(x); //打印1到10之间所有偶数
}