一.java环境配置及入门基础:
1. jvm,jre,jdk的含义
- jvm:Java Virtue Machine 即java虚拟机,是java程序的运行平台,实现了java语言的跨平台。
- jre: Java Runtime Environment 即jre=jvm+核心类库。
- jdk:Java Development Kit 即jdk=jre+开发工具。如:javac ,jar,javap.
2.path:查找.exe文件
方式一:直接在path路径中添加jdk-bin的安装路径。
方式二:提取变量,将jdk路径定义为某个变量如:java_home=jdk路径。然后在path路径中添加%java_home%\bin;
推荐方式二:因为path中配置的路径非常多,当jdk路径发生改变时,修改其path路径会非常麻烦。而方法二只需修改
java_home即可。
3.关键字
被java语言赋予赋予特定含义的单词,全部小写 。如class int extend等 另外:goto 和 const作为保留关键字。
4.标识符
- 就是给类,接口,方法,变量等起名字的字符序列
- 组成规则:英文字母大小写,数字,$,_
- 注意事项:不能以数字开头,不能是java中的关键字,区分大小写。
- 常见的命名规则:
- 包:全部小写 单级包:小写 举例:henson; 多级包:全部小写,域名反转,并用.隔开。
- 类或接口: 一个单词:首字母大写 举例:Person ; 多个单词:每个单词首字母大写 举例:HelloWorld
- 方法或变量:一个单词:首字母小写 举例:name; 多个单词:从第二个单词开始受字母大写 举例:myName
- 常量:全部大写 一个单词:大写 举例:PI; 多个单词:大写,并用_隔开 举例:MAX_VALUE
5.常量:在执行程序过程中,其值不能发生改变,分为字面值常量和自定义常量。
整数常量的分类:二进制 以0b开头 如:0b101;八进制 以0开头 如:071;十六进制 以0x开头 如:0xfff;整数默认是十进制
6.数据类型:基本数据类型(byte,short,int,long,float,double,char,boolean),引用数据类型(类,接口,数组)
- A:整数 占用字节数 范围
- byte 1 -128 ~ 127
- short 2 能表示65536个数
- int 4 大概能表示43亿个数(不能用int表示全体人类)
- long 8
- B:浮点数
- float 4
- double 8
- C:字符
- char 2 (注意Java中,字符采用Unicode编码,和c不一样)
- D:布尔
- boolean 1
注意:
整数默认是int类型,浮点数默认是double。
长整数要加L或者l,建议后面加L。
单精度的浮点数要加F或者f。
7.数据类型转换:
- boolean类型不参和其他类型进行转换
- 默认转换:从小到大,byte,short,char----->int------>long------>float------>double
- byte,short,char之间不相互转换,直接转成int类型参与运算。即使是同一个数据类型的运算,也会先转换成int类型。
- 强制类型转换:从大到小,可能会有精度损失,一般不建议这么做。举例 int a=(int)12.34;
- 思考题:
A:下面两种方式有区别吗?
float f1 = 12.345f;
float f2 = (float)12.345;//是将double强转为float
B:下面的程序有问题吗,如果有,在哪里呢?
byte b1 = 3;
byte b2 = 4;
// byte b3 = b1 + b2; /* 编译不成功的原因为:a,b均为byte类型,在参与运算时会隐式转为int类型,又因为a,b
均为变量,其值随时可能发生改变,编译器不能确定其大小,也就不确定是否能将为int
类型的结果转为byte,所以会报错 */
byte b4 = 3 + 4;/*能编译成功的原因是:虽然相加后的结果为int型,但是2,3均为常量,其值不会改变
编译器就会判断结果有没有超出byte的表示范围,若每超出则会强制转为byte;否则报错。*/
C:下面的操作结果是什么呢?
byte b = (byte)130; // -126
130二进制补码为:0000 0000 0000 0000 0000 0000 1000 0010 强转规则为:大范围转小范围时,直接舍弃高位。
舍弃高位:1000 0010
转为原码:1111 1110 等于:-126
D:字符参与运算
是查找ASCII里面的值
'a' 97
'A' 65
'0' 48
System.out.println('a'); //a
System.out.println('a' + 1); //98
8.运算符:
(1)算术运算符
A:+,-,*,/,%,++,--
B:+的用法:加法,正号,字符串连接符(对+进行了重载);
C:/和%的区别:
- / : 整数之间的相除,结果是整数; 向0取整;如果想得到小数,*1.0即可;
- % : 原理:a % b = a - (a / b) *b; 取余运算是一个很耗时的操作,在性能比较关键的时候最好不要使用;
- 数学中的取余运算规则为:a mod b=a- [a/b]*b 这里[]代表向下取整 如[-2.3]=-3;
D:++和--的用法:
- a:他们的作用是自增或者自减
- b:放在操作数的前面:先自增或者自减,再参与操作 ; 放在操作数的后面:先参与操作,再自增或者自减;
- c:底层原理:
a = a++;
int temp = a;
a++;
a = temp;
(2)赋值运算符:=,+=,-=,*=,/=,%=等;赋值运算符是从右向左结合的;赋值运算是有值的,它的值等于右边表达式的值,也就是 说赋值语句支持连续赋值。如:a=b=2;另外,扩展的赋值语句隐式包含了强制类型转换,举例如下:
a. short s = 1; b. short s = 1;
//s = s + 1; s += 1;
请问上面的代码哪个有问题? 答:a会编译错误。因为int类型的变量不能隐式转为short;而b中的扩展赋值语句隐含强制 转换 ,可将int 1转为 short 1;
(3)比较运算符:比较的是值。
(4)逻辑运算符:&,|,^,!,&&,|| 用于连接boolean类型的式子;&&,|| 具有短路功能,推荐使用。
(5)位运算符:
A:&, |, ^, ~, <<, >>, >>>
B:结论:
&:同时为1,才为1,否则为0
|: 同时为0,才为0,否则为1
^: 相同为0,不同为1;
a ^ b = b ^a;
a ^ 0 = a;
a ^ a = 0;
~: ~0为1,~1为0;
<<: 移除的高位丢弃,低位补0;
左移n个单位,相当于乘以 2 ^ n;
>>: 移除的低位丢弃,如果符号位是0,则高位补0,如果符号位是1,则高位补1;
右移n个单位,相当于除以2 ^ n;
>>>: 移除的低位丢弃,高位补0;注意事项:如何移动的单位a超过了字长m, 则实际移动
a mod m (数学中的取余运算)
C:试题
a: 判断一个数是否是奇数 a & 1 == 1;
b: 对2 ^ n 取余。 a & (2^n - 1);
c: 如何判断一个数是否是2^n a & (a-1) == 0
d: 两个整数之间的交换;
e: 有一堆数,都是成对出现的,只有一个单独的,找出这个单独的数
f: 用最有效率的方式求2 * 8的值 2 << 3;
(6)三元运算:
A:格式
比较表达式 ? 表达式1 : 表达式2;
B:执行流程:
首先计算比较表达式的值,看是true还是false。
如果是true,表达式1就是结果。
如果是false,表达式2就是结果。
C:案例:
a:比较两个数据是否相等
b:获取两个数据中的最大值
c:获取三个数据中的最大值
int max = (a > b ? a : b) > c ? (a > b ? a : b) : c;
int max = a > b ? (a > c ? a : c) : (b > c ? b : c);D:注意:嵌套的三元运算符也是从左向右执行的,即便右边的有括号;
int a=1;int b=2; System.out.println(a<b?false:(a==b?++a:++b));System.out.println(b);
输出结果为:false 2 显然程序先执行的是左边的三元运算。
9.条件控制语句:
switch语句注意点:
- case 后面只能为常量;
- 表达式可以是:byte,short,int,char;JDK5之后可以是枚举;JDK7之后可以是字符串;
- break:表示switch到这里中断,跳出switch语句
- default:如果所有的情况都不匹配,就执行这里
- switch语句的结束条件: a:遇到break就结束了;
10.循环语句:
(1)break:中断的意思
A:用在循环和switch语句中,离开此应用场景无意义。
B:作用
a:跳出单层循环
b:跳出多层循环,需要标签语句的配合
(2)continue:继续
A:用在循环中,离开此应用场景无意义。
B:作用
a:跳出单层循环的一次,可以继续下一次
b:跳出多层循环,需要标签语句的配合
(3)return:返回
A:用于结束方法的,后面还会在继续讲解和使用。
B:一旦遇到return, 方法就不会在继续往后执行。