------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一丶关键字
关键字概述
Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名、方法名、类名、包名。
常见的关键字
备注:不必死记硬背,如果使用关键字作为标识符,编译器能提示错误。
goto 是java的保留关键字,意思是java并没有使用goto,以后是否使用未定。
二丶标示符
什么是标示符
就是程序员在定义java程序时,自定义的一些名字,例如helloworld 程序里关键字class 后跟的Demo,就是我们定义的类名。类名就属于标识符的一种。
标识符除了应用在类名上,还可以用在变量、函数名、包名上。(要求同学们先记住,以后会详细见到这些)。
标示符必须遵循以下规则
1. 标识符由26个英文字符大小写(a~zA~Z)、数字(0~9)、下划线(_)和美元符号($)组成。
2. 不能以数字开头,不能是关键字
3. 严格区分大小写
4. 标识符的可以为任意长度
标示符的命名规范
1. 包名
多个单词组成时所有字母小写(例:package com.itcast)
2. 类名和接口
多个单词组成时所有单词的首字母大写(例:HelloWorld)
3. 变量名和函数名
多个单词组成时第一个单词首字母小写,其他单词首字母大写(例:lastAccessTime、getTime)。
4. 常量名
多个单词组成时,字母全部大写,多个单词之间使用_分隔(例:INTEGER_CACHE)
注意:只是为了增加规范性、可读性而做的一种约定,标识符在定义的时候最 好见名知意,提高代码阅读性。
三丶注释
注释的种类
1.单行注释(line comment)用//表示,编译器看到//会忽略该行//后的所文本
2.多行注释(block comment)用/**/表示,编译器看到/*时会搜索接下来的*/,忽略掉/**/之间的文本。
3.文档注释用/** */表示,是java特有的注释,其中注释内容可以被JDK提供的工具 javadoc 所解析,生成一套以网页文件形式体现的该程序的说明文档。
注意:多行注释中可以嵌套单行注释,多行注释不能嵌套多行注释。错误!!
文档注释:
1. 需要使用sum给我们提供的javadoc工具生成一个html的说明文档。
2. 只能抽取public的属性或者方法内容。
@author 作者
@version 版本
@param 方法的参数
@return 返回值
注释的使用细节:
三种注释可以出现在程序的任何地方,但是不推荐找任意位置。
1. 编程习惯:
1. 给那条语句进行说明,注释应该写在该语句的旁边。
2. 单行注释一般写在语句的后面多行注释和文档注释一般写在语句的上面
注意:文档注释只能出现在类、属性、方法的上面。
2 注释的嵌套
1.单行注释可以在单行注释里面。
2.多行注释不能嵌套在多行注释里面。
3 注释的调试作用:
1. 可以作为初学者的调试方式。
2. 可以帮组初学者确定代码的错误之处。
四丶常量
常量就是在程序中出现不可改变的值。
常量类型
Java中常量的分类:
整数常量:所有整数
小数常量:所有小数
布尔常量:只有true和false
字符常量:使用’’引起来的单个字符
字符串常量:使用“”引起来的字符序列,“” 、“a”、””
null常量:只有一个值null
char 类型
char类型表示的是单个字符类型,任何数据使用单引号括起来的都是表示字符。字符只能有一个字符,比如:普通的老百姓穿上军装就是军人。
注意:特殊字符的转义序列:转义字符
转义字符的概述:
特殊字符使用”\”把其转化成字符的本身输出,那么使用”\”的字符称作为转移字符。
需求:使用输出语句,打印出带引号的信息例如输出。
System.out.println("teacher said"java is fun"");编译是无法正常通过的。语法有错误,编译器读到第二个引号就认为是字符串的结束,剩余的不知道怎么处理。如何解决这个问题:java中使用转义字符来表示特殊的字符。一个转义字符以反斜杠(\)开始。
问题:想要打印带引号的字符串怎么办,就可以使用反斜杠(\)后跟字符,这个反斜杠就是转义字符。
\r 表示接受键盘输入,相当于按下回车。
\n 表示换行。
\t 制表符,相当于Table键
\b 退格键,相当于Back Space
\’ 单引号
\’’ 双引号
\\ 表示一个斜跨
上述问问题解决:System.out.println("teacher said\"java is fun\"");
注意:换行符就是另起一行,回车符就是回到一行的开头,所以我们平时编写文件的回车符应该确切来说叫做回车换行符
boolean 类型
boolean由数学家Geogore Boole 发明
boolean 类型用来存储布尔值,在java中布尔值只有2个,true和false。
booleanflag=true;
flag=false;
Java中这8中基本数据类型都是小写的。
五丶进制转换
整形的表现形式
1. 十进制:都是以0-9这九个数字组成,不能以0开头。
2. 二进制:由0和1两个数字组成。
3. 八进制:由0-7数字组成,为了区分与其他进制的数字区别,开头都是以0开始。
4. 十六进制:由0-9和A-F组成。为了区分于其他数字的区别,开头都是以ox开始。
十进制与二进制的装换
十进制转二进制的转换原理:除以2,反向取余数,直到商为0终止。
二进制转十进制的转换原理:就是用二进制的每一个乘以2的n次方,n从0开始,每次递增1。然后得出来的每个数相加
十进制与二进制的装换
八进制转十进制原理: 用把进制的数不断乘以8的n次方,n从0开始,每次递增1。
十进制与十六进制之间的转换
十六进制特点:由0~9 a(10) b(11) c(12) d(13) e(14) f(15)组成。
十进制转十六进制原理:就是不断除以16,取余数。
六丶变量
1. 变量的概述
用于存储可变数据的容器。
2. 变量存在的意义
计算机主要用于处理生活中的数据,由于生活中存在大量的可变数据,那么计算机就必须具备存储可变数据的能力。
比如:
1.时间每一秒都在发生变化,根据不同的时间要有不同的处理方式。
2.气象站会根据温度发布天气预报信号。
3. 变量的特点
正常情况下牛奶盒装的都是牛奶,而且会根据牛奶的多少去决定要多大的容量的牛奶盒,A和B两位同学同时把牛奶盒放进篮子里面,但是需要区分两个牛奶盒是谁的,都需要在牛奶盒上做一个标志。
特点:
1. 必须要有大小
2. 存储一定格式的可变数据
3. 必须要有名字
变量的声明
根据上述变量的特点,所以我们声明一个变量的时候需要确定变量的大小,类型、名字三个特点:
错误: 1024byte temp = 1000000;
错误原因,java有自己的变量类型。
变量的数据类型
1. 整型
byte 代表一个字节的大小 8bit 2(8) -128~127 256
short 代表两个字节的大小 16bit 2(16) -2(15)~2(15)-1
int 代表四个字节的大小 32bit 2(32) -2(31)~2(31)-1
long 代表八个字节的大小 64bit 2(64) -2(63)~2(63)-1
如果一个数值没有采取特殊的处理,那么该整数默认的类型是int。
可以使用数值后面添加L或小写L改变默认的整数类型。
2. 浮点型
float 代表四个字节的大小 32bit
double 代表八个字节的大小 64bit
java程序中所有的小数默认的类型是double类型,所以需要使用特殊的符号改变默认的小数类型。
3. 字符型
char 代表两个字节的大小 16bit 2(16)
原理:将字符映射为码表中对应的十进制数据加以存储。
4. 布尔型
boolean
代表四个字节或一个字节,当是基本的boolean时是四个字节int当是基本类型的数组时每一个boolean是一个字节。
变量的初始化
初始化方式1: 数据类型 变量名字 = 数值。
初始化方式2: 数据类型 变量名字 , 变量名字 = 数值。
案例:
方式1: double d = 3.14;
方式2: double d ; d = 3.14 ;
数据类型的转换
java中可以进行不同数据类型的加减乘除运算吗?是可以的。在算术运算符中已经体验过如果两个整数(int)相除会去掉小数部分。如果需要保留小数部分,可以让除数或者被除数变为double类型的(5变为5.0)。其实Java是自动的将int的那个数变为了double类型了也就是Java自动的将整数变为了浮点数。例如5/2.0 其实是5.0/2.0
1、 自动类型转换(也叫隐式类型转换)
可以将一个数赋值给更大数值范围的变量,例如可以经byte 变量赋值给short变量可以将short变量赋值给int变量可以将int变量赋值给long变量。
Java内部其实做了工作就是自动将数值进行了类型提升,就叫做自动类型转换(也叫隐式类型转换)
byte b = 1; //00000001
short s = b; //00000000 00000001
int i = s;
long lon = i;
doubled = lon; //1.0
要实现自动类型的转换,需要满足两个条件,第一两种类型彼此兼容,第二目标类型取
值范围必须大于源类型。所有的数字类型,包括整形和浮点型彼此都可以进行转换。
例如:
byte b=100;
int x=b;
System.out.println(x);//程序把b结果自动转换为int类型。
2、 强制类型转换(也叫显式类型转换)
不可以将一个数值赋给范围更小数值范围的变量,除非进行类型转换。
byte b = 100;
b =b + 2;
System.out.println(b);
上述例子发生了什么,发生了类型转换。
b+2 遇到了加法运算,2默认是int类型,byte类型b变量存储的值自动类型提升为
了int类型。执行完加法运算后的结果就是int类型,想要将int的类型值放入到byte类型变量b中,无法放入,编译报错。
byte b=1;
b=(byte)(b+2);
当两种类型彼此不兼容,或者目标类型取值范围小于源类型(目标是byte源是int)
无法自动转换,此时就需要进行强制类型转换。
强制类型转换需要注意:
损失精度!!!
3、类型转换的原理
可以把byte 理解为1两的碗,short 2两的碗,int 4两的碗,long 8两的碗。1两碗的满碗酒可以倒入 2两 4两 8两的碗中。但是 4两碗的酒倒入1两碗的酒就有一些问题。
1、 什么时候要用强制类型转换
比如小数部分只想保留整数部分.
一定要清楚要转换的数据在转换后数据的范围内否则会损失精度.
publicstaticvoid main(String[] args) {
byte b = 100;
b = (byte) (b + 2);
System.out.println(b); // 102
//舍弃小数部分
double d=5.5;
intnum=(int)d;
}
2、 表达式的数据类型自动提升
算术表达式,逻辑表达式
所有的byte型、short型和char的值将被提升到int型。
如果一个操作数是long型,计算结果就是long型;
如果一个操作数是float型,计算结果就是float型;
如果一个操作数是double型,计算结果就是double型。
分析 System.out.println(‘a’+1)结果?
自动类型提升
强制类型转换
byte b = 2;
/*
* 强制类型转换,强制将b+2强制转换为byte类型,再赋值给b
*/
b = (byte) (b + 2);
System.out.println(b);// 4
总结:
所有数值运算符都可以用在char型数据上,如果另一个操作数是一个数字或者字符,那么char会自动提升为int型,如果另一个操作数是字符串,那么字符就会和字符串相连。
七丶运算符
= , +=, -=, *=, /=, %=
运算符
运算
范例
结果
=
赋值
a=3,b=2
a=3,b=2
+=
加等于
a=3,b=3;a+=b;
a=5,b=2;
-=
减等于
a=3,b=2,a-=b;
a=1,b=2;
*=
乘等于
a=3,b=2,a*=b;
a=6,b=2
/=
除等于
a=3,b=2,a/=b;
a=1,b=2;
%=
模等于
a=3,b=2,a%=b;
a=1,b=2
a+=b 可以想象成 a=a+b;
变量声明完了之后,可以使用赋值语句(assignment statement)给变量赋一个值,Java中使用等号(=)作为基本的赋值运算符(assignment operator),
格式如下:
variable = expression;
变量 = 表达式;
变量我们已经知道如何声明,表达式具体如何定义?
表达式的定义:
表达式涉及到值(常量),变量和通过运算符计算出的值,以及他们组合在一起计算出的新值。
x =y+1;
例如:
publicstaticvoid main(String[] args) {
intx = 1; // 声明int变量x,赋值1给变量x
int y = 0; // 声明int变量y,赋值0给变量y
doublearea; // 声明double变量area
double radius = 1.0; // 声明double变量radius,并赋值1.0给变量radius
x = 5 * (3 / 2) + 3 * 2; // 将=右半部分表达式的计算结果赋值给变量x
x = y + 1; // 将变量y和1的求和的值赋值给变量x
area = radius * radius * 3.14159; // 将计算面积的值赋值给变量area
}
如何比较两个值?使用比较运算符 3和5谁大,在java中如何比较?
比较运算符比较的两边操作数,结果都是boolean的,只有true和false两种结果。
运算符
运算
例子
结果
==
相等于
4= =3
false
!=
不等于
4!= 3
true
<
小于
4 < 3
flase
>
大于
4>3
true
<=
小于等于
4<=3
false
>=
大于等于
4>=3
true
Instanceof
检查是否是类的对象
"hello"instanceof String
true
注意的细节:
1.使用比较运算符的时候,要求两种数据类型必须一致。
byte、short、char 会自动提升至int。
逻辑运算符用于连接布尔型表达式,在Java中不可以写成3<x<6,应该写成x>3 & x<6 。
“&”和“&&”的区别:单与时,左边无论真假,右边都进行运算;双与时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。
“|”和“||”的区别同理,双或时,左边为真右边不参与运算。
“ ^ ”异或与“|”或的不同之处是:当左右都为true时,结果为false。
& 与 | 或 ^ 异或 ! 非
1、& 与
true & true = true ;
false & true= false;
true & false = false;
false & false= false;
总结 & 符号特点
& : 只要两边的boolean 表达式结果,有一个false.那么结果就是false
只有两边都为true ,将结果为true.
2、| 或
true | true =true;
ture | false =true;
false | true =true;
false | false =flase;
总结 | : 两边只要有一个为真结果就为真,当两边同为假时结果才为假.
3、^ 异或
^ : 两边相同结果是false
两边不同结果是true;
4、! 非
!true = false
!false= true
5、&& 短路
研究发现,&运算只有两边全为真的时候,结果才为真,那么当左边为假的时候就没有必要在进行判断,&&就产生了。
int a =4;
a >3 && a< 6;
a >3 & a< 6 ;
在这种情况下世没有区别的
如果:
a =2
a >3 & a< 6 2大于 3 为假, 接着运算 2 小于6 为真,总的结果为假
a >3 && a< 6; 此时a 不大于3 结果为false 右边不运算了.即短路.所以&& 比& 效率稍微高了一点.
publicstaticvoid main(String[] args) {
int x = 0;
int y = 1;
if (x == 0 && y == 1) {
System.out.println(x + y);
}
}
按位操作符用来操作整数基本数据类型中的单个比特(bit),就是二进制,按位操作符会对两个参数中对应的位(bit)执行布尔运算,最终生成一个结果。按位操作符来源于C语言面向底层的操作,Java设计的初衷是嵌入式电视机机顶盒,所以面向底层的操作也保留了下来。
任何信息在计算机中都是以二进制的形式保存的,”&”、“|”、“^”除了可以作为逻辑运算符也可以作为位运算符。位运算是直接对二进制进行运算。他们对两个操作数中的每一个二进制位都进行运算。例如int是由32个二进制数组成,因此使用位运算符可以对整数值的二进制数进行运算。
位(bit)运算符:
位运算符
运算符含义
&
与(AND)
|
或(OR)
^
异或
~
取反
规则:
可以把1当做true 0当做false
只有参与运算的两位都为1,&运算的结果才为1,否则就为0。
只有参加运算的两位都是0,| 运算的结果才是0,否则都是1。
只有参加运算的两位不同,^ 运算的结果才为1,否则就为0。
1、& 与运算
& 参见运算的两位数都为1,&运算符结果才为1,否则就为0。
6&3
2、| 或运算
| 参与运算的两位都为0,|运算的结果才为0,否则就为1。
3、^ 异或运算
^只有参加运算的两位不同,^运算的结果才为1,否则就为0。
1、 ~ 反码
就是取反,二进制只有1和0,取反就是如果为1,取反就是0,如果是0,取反就是1。
System.out.println(~6);//-7
结论:当参与取反的数值是正数时,把对应的值加上负号,再-1;
当参与取反的数值是负数时,把对应的值加上负号,再-1;
负数的表现形式就是对应的正数取反,再加1。负数的最高位肯定是1。
4、负数表示
负数对应的正数的二进制取反(反码)再加一。
-6
0000-0000
0000-0000
0000-0000
0000-0110
6
1111-1111
1111-1111
1111-1111
1111-1001
取反
1111-1111
1111-1111
1111-1111
1111-1010
加1
5、异或特点
一个数异或同一个数两次,结果还是那个数. 用处一个简单的加密思想.
6^3^3
位运算符
运算符
运算
范例
<<
左移
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,被移除的高位丢弃,空缺位补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
技巧:可以理解为二进制1就是true,0就是false。
案例:
1、左移 (算术移位)
3<< 2 是如何在计算机里是实现的?
首先将3转换为2进制,
00000000
00000000
00000000
00000011
3 的二进制
00000000
00000000
00000000
000011
左移2位,砍掉高位
0000 0000
0000 0000
0000 0000
0000 1100
低位补0
结果是12,所以3<<2 =12;
结论:左移就相当于乘以2的位移个数次幂.
2、右移
6>>2
结果是1,所以6>>2 =1;
结论一个数往左移越移越大,往右边移越来越小.
3、无符号右移 (逻辑移位)
通过演示发现右移时高位就空了出来,>> 右移时高位补什么要按照原有 数据的最高位来决定。
1111-1111 1111-1111 1111-1111 1111-1010 -6>>2
1111-1111 1111-1111 1111-1111 1111-0010
最高位补什么要看原有最高位是什么
那么使用>> 后原来是最高位1 的那么空出来的最高位还是1 的,是0的还是0。
如果使用>>> 无论最高位是0还是1 空余最高位都拿0 补,这就是无符号右移。
1111-1111 1111-1111 1111-1111 1111-1010 -6>>>2
001111-1111 1111-1111 1111-1111 1111-10
结果是;1073741822
格式
(条件表达式)?表达式1:表达式2;
如果条件为true,运算后的结果是表达式1;
如果条件为false,运算后的结果是表达式2;
示例:
1获取两个数中大数。
int x=3,y=4,z;
z = (x>y)?x:y;//z变量存储的就是两个数的大数。
int x = 1;
int y = 2;
int z;
z = x > y ? x : y;
System.out.println(z); //2
2判断一个数是奇数还是偶数。
int x=5;
System.out.println((x%2==0?"偶数":"奇数"));
4 运算符的优先级与结合性