目录
内容汇总
第一章
java就业环境和应用领域的介绍
第二章
1995年发布第一个java版本
java语言特点
(1)面向对象的
(2)健壮的
(3)跨平台性(依靠java虚拟机JVM实现)
(4)解释型语言
JDK和JRE
JDK=JRE + java开发工具(javadoc,javac等)
JRE= JVM+java的核心类库
转义字符:
\t制表位 ;
\n换行 ;
\r回车
\\表示 \;
\"表示"
\'表示'
注释:
1) 单行注释 //
2) 多行注释 /* */
3) 文档注释 /** */
实际运用:
/**
* @author 韩顺平
* @version 1.0
*/
相对路径和绝对路径
相对路径:从当前目录开始定位形成的一个路径
绝对路径:从根目录(C盘或者D盘)开始定位形成的一个路径
常用dos命令
dir:查看当前目录是有什么内容
切换盘符 D:
切换路径:cd
清屏:cls
退出:exit
第三章
变量三要素:
变量名、值、数据类型
加号+的使用:
1)左右两边都是数值型时做加法运算 2)有一方是字符串时做拼接运算
数据类型(重点!)
浮点数=符号位+指数位+尾数位
小数2.7和3/8.1在计算机中并不是相等的,其输出的是近似于2.7的一个小数
Java API
Java提供的基本编程接口
基本数据类型转换
(byte、short)和char之间不会相互自动转换
byte,short,char 他们三者可以计算,在计算时首先转换为 int 类型
byte b2 = 1;
byte b3 = 2;
那么b2+b3也就自动转换为了int型数据
强制类型转换
用()即可,如int i = (int)1.9;
如变量是公式则用小括号 int i = (int)(1.9*4+3.2)
String和基本数据类型转换
1)Stiring转基本类型: +""即可,int n1 = 5; String s1 = n1 + "";
2)基本类型转换到String:调用parseXX方法
String s1 = "123";
int num1 = Interger.parseInt(s1);
float num2 = Float.parseFloat(s1);
boolean b = Boolean.parseBoolean("true");
字符串转成字符:取出字符串的第一个字符
System.out.println(s1.charAt(0));//外国人从0开始数数,得到s1的第一个字符1"
第四章
运算符介绍
1) 算术运算符
2) 赋值运算符
3) 关系运算符 [比较运算符]
4) 逻辑运算符
5) 位运算符 [需要二进制基础]
6) 三元运算符
算术运算符
正号、负号、加、减、乘、除、取模(余)、自增、自减、字符串相加(拼接)
除法/:整数之间做除法时只保留整数部分舍弃小数部分
在 % 的本质 看一个公式!!!! a % b = a - a / b * b
自增:++
两种情况
1)先取值再运算 a = 2 ; b = a++;则 a = 3 ; b = 2;
2)先运算再取值 a = 2 ; b = ++a;则 a = 3 ; b = 3;
自减:同理自增
1)先取值再运算 a = 2 ; b = a--;则 a = 1 ; b = 2;
2)先运算再取值 a = 2 ; b = --a;则 a = 1 ; b = 1;
关系运算符
关系运算符的结果都是 boolean 型,true或者false
逻辑运算符
1) 短路与 && , 短路或 ||,取反 !
短路与&&:有F则F;若左边有F则不再判断右边
短路或||:有T则T;若左边有T则不再判断右边
取反:若a为true,结果是false
2) 逻辑与 &,逻辑或 |,^ 逻辑异或
逻辑与&:有F则F;若左边有F则继续判断右边
逻辑或||:有T则T;若左边有T则继续判断右边
异或^:两者不同时为true;两者同为true或者false时,结果是false
练习题:
public class Review{
public static void main(String[] args){
boolean x = true;
boolean y = false;
short z = 46;
if((z++ == 46)&&(y = true));
z++;
if((x = false)||(++z == 49));
z++;
System.out.println("z=" + z);
}
}
运行分析如下图
此题目的两个陷阱:赋值语句 y = true 和 x = false;
y = true;将true赋值给y,此条件为true
x = false;将false赋值给x,此条件为false
赋值运算符
基本赋值运算符 =
复合赋值运算符 += ,-= ,*= , /= ,%= 等
a += b; 即 a = a + b;
a -= b; 即 a = a - b;
注意事项:
复合赋值运算符会进行类型转换
byte b = 3; b += 2; // b+2是int型;自动转换 b = (byte)(b + 2);
b++; // b = (byte)(b+1);同上
三元运算符
基本语法 条件表达式 ? 表达式 1:表达式 2;
口诀: [一灯大师:一真大师]
条件表达式为true,则运算后的结果是表达式 1;
反之则为表达式2
细节:表达式 1 和表达式 2 要为可以赋给接收变量的类型(或可以自动转换或强制转换)
public class TernaryOperatorDetail{
public static void main(String[] args){
//编写一个main方法
//表达式 1 和表达式 2 要为可以赋给接收变量的类型(或可以自动转换或强制转换)
int a = 10;
int b = 99;
//result为int型变量,3.1和4.2为double型变量,从double转换到int可能会有损失
//int result = a > b ? 3.1:4.2;
int result = a > b ? (int)3.1 : (int)4.2;//强制类型转换
double result1 = a > b ? 3.1 : 4.2;//前后都是double型变量
System.out.println("result=" + result);
System.out.println("result1=" + result1);
//三元运算符可以转成 if--else 语句
if(a > b){
System.out.println("result1=" + 3.1);
}else{
System.out.println("result1=" + 4.2);
}
}
}
运算符优先级
只有单目运算符和赋值运算符是从右到左的,单目运算符是指只有一个操作数(++a;a++)
使用多了就熟悉了
标识符
命名规则
(必须遵守)特别重要
①由26个英文字母大小写,0到9,_或$组成
②不能用数字开头,如 int 5n 就是错的
③不可以直接使用关键字和保留字,但是可以包含关键字和保留字(如class public goto)//goto是保留字,即现在不用但是将来可能会用到
④java中严格区分大小写,长度不受限制,abc和Abc aBc abC是不同的变量
⑤标识符中不能包含空格,比如 int a b = 90,这种写法是错误的
规范
包名:全都是小写字母,用.来间隔
类名和接口名:多个单词组成时,第一个字母大写,eg:TernaryOperator;大驼峰
变量名:多个单词组成时,第一个单词的第一个字母小写,后面的单词的第一个字母大写eg:totalNum;stuName;小驼峰
常量名:所有字母都要大写,单词之间用_连接(与包名对照)eg:XXX_YYY_ZZZ
关键字
被java赋予了特殊含义,用作专门用途的字符串
所有字母都是小写
关键字不能作为标识符
键盘输入语句
import java.util.Scanner;//表示把java.util下的Scanner类导入到此文件
Scanner myScanner = new Scanner(System.in)创建一个Scanner对象
不同数据类型接收输入时使用的方法不同
int型 int age = myScanner.nextInt();
double型 double salary= myScanner.nextDouble();
char型 char gender = myScanner.next().charAt(0);
String型 String name = myScanner.next();
进制
基本功,整数的四种表达形式
二进制:只有两个数字0、1 ,满 2 进 1,以 0b 或 0B 开头,如:0B01010
十进制:0-9 ,满 10 进 1。
八进制:0-7 ,满 8 进 1, 以数字 0 开头表示。
十六进制:0-9 及 A(10)-F(15),满 16 进 1,以 0x 或0X为开头,A-F不区分大小写
进制转换
一、其他进制转换为十进制
1)二转十
从最低位(右边)开始,将每个位上的数提出来乘以2的(位数-1)次方
eg: 0b1101011=1*2^0+1*2^1+0*2^2+1*2^3+0*2^4+1*2^5+1*2^6
=1+2+0+8+0+32+64
=107
2)八转十
从最低位(右边)开始,将每个位上的数提出来乘以8的(位数-1)次方
eg:04723=3*8^0+2*8^1+7*8^2+4*8^3
=3+16+448+2048
=2515
3)十六转十
从最低位(右边)开始,将每个位上的数提出来乘以16的(位数-1)次方
eg:0XB63=3*16^0+6*16^1+11*16^2
=3+96+2816
=2915
二、十进制转换为其他进制
1)十转二
规则:将该数不断除以 2,直到商为 0 为止,然后将每步得到的余数倒过来,就是对应的二进制。
eg:123转换成二进制,结果为0B0111 1011
2)十转到八
规则:将该数不断除以 8,直到商为 0 为止,然后将每步得到的余数倒过来,就是对应的八进制。
eg :131转成八进制,结果为0203
3)十转到十六
规则:将该数不断除以 16,直到商为 0 为止,然后将每步得到的余数倒过来,就是对应的十六进制。
案例:请将 237 转成十六进制,结果为0xED
三、二、八、十六之间的转换
1)二转到八
从低位(右边)开始,将二进制数每三位一组(不足的补零),从左往右依次写上421,然后计算,eg 0B0010 1111转成八进制为057
2)二转到十六
将十六进制数每 1 位,转成对应的 4 位的一个二进制数即可。8421法则
eg:ob0010 1111换成十六进制为0X2F;
3)八转到二
421倒转计算,eg:0237
2=4*0+2*1*1*0,转成二进制就是010
3=4*0+2*1*1*1,转成二进制就是011
7=4*1+2*1*1*1,转成二进制就是111
转成二进制就是0B1001 1111
4)十六转二
8421倒转计算,eg: 0x23B
2=8*0+4*0+2*1+1*0(0010)
3=8*0+4*0+2*1+1*1(0011)
B(11)=8*1+4*0+2*1+1*1(1011)
结果是0B0010 0011 1011
计算机内部处理的信息都是采用的二进制
原码、反码、补码(重点、难点)
八个重要知识点
1.二进制的最高位(最左边)是符号位,0表示正数,1表示负数
2.正数的原码、反码、补码都是一样的(三码合一)
3.负数的反码=符号位不变,其他的取原码的反值(反码转原码同理)
4.负数的补码=它的反码+1;反码=补码-1;
5.0的反码补码都是0
6.java没有无符号数,换言之,java中的数都是有符号的
7.在计算机运算的时候,是以补码的方式来运算的
8.当我们看运算结果的时候,要看它的原码
位运算符详解
java中有7个位运算符(&、|、^、~、>>、<<和 >>> )
按位与 & :两位全为1,结果为1,否则为0(把逻辑运算符中的true和false替换成1和0)
按位或 | :两个有一个为1,结果为1,否则为0
按位异或 ^ 两个数相同(同为0或者同为1)结果为0,两个数不同(一个为1,一个为0)结果为1,与逻辑异或大同小异
按位取反 ~ :0变1,1变0
算术右移>>:①正数时:1>>3,计算公式1\2^3,②负数时:-1>>3,求出-1的补码,向右移三位,空缺用1补齐,再求出此结果的原码
算术左移<<:①正数时:1>>3,计算公式1*2^3,②负数时:-1>>3,求出-1的补码,向左移三位,空缺用0补齐,再求出此结果的原码
无符号右移 >>>:右移的空缺全部用0补全,不用符号位补 正数运算同算术右移,负数运算空缺是用0补全,就是最终结果,不用再推算反码和原码
未解决的问题 -1 >>>2
解决办法:反码右移后直接输出结果,不用推算反码和原码
第五章程序控制结构
1) 顺序控制 2) 分支控制 3) 循环控制
顺序控制
按照代码顺序执行,中间没有任何判断和跳转
分支控制 if-else
分为三种
1) 单分支 if
流程图
2) 双分支 if-else
流程图
3) 多分支 if-else if -....-else
基本语法
多分支的流程图(重要!)
当所有条件表达式都不成立的时候,执行else的代码块,只有1个入口
赋值语句:
public class If04{
//编写一个main方法
public static void main(String[] args){
boolean b = true;
if(b = false){//赋值语句,b被重新赋值为false,
System.out.println("a");
}else if(b){// b为false,不执行此代码块
System.out.println("b");
}else if(!b){//b为false,取反为true,打印c
System.out.println("c");
}else{
System.out.println("d");
}
}
}
关系判断语句
public class If04{
//编写一个main方法
public static void main(String[] args){
boolean b = true;
if(b == false){//判断语句,b!=false,不执行此代码块
System.out.println("a");
}else if(b){// b为true,执行此代码块
System.out.println("b");
}else if(!b){//
System.out.println("c");
}else{
System.out.println("d");
}
}
}
嵌套分支
在一个分支结构中又完整的嵌套了另一个完整的分支结构,最多不超过三层
语法
switch 分支结构
在java中只要是一个表达式就会有一个值返回
语法
说明:将表达式的值一次与常量1、2、3等匹配,匹配成功就执行语句块,break退出这个swtich语句,如果所有的都没有匹配成功则执行default语句
流程图
说明:1)在java中只要有返回值,就是一个表达式2)表达式的返回值必须是char,byte,short,int,string,enum(枚举) 3)case后面接的必须是常量
for循环
基本语法
流程图
使用细节
1) 循环条件是返回一个布尔值的表达式
2) for(;循环判断条件;) 中的初始化和变量迭代可以写到其它地方,但是两边的分号不能省略。
3) 循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开,循环变量迭代也可以有多条变量迭代 语句,中间用逗号隔开 eg: for(int i = arr.length - 1, j = 0; i >= 0; i--, j++);
while 循环控制
基本语法
流程图
do..while 循环控制
流程图
do..while 循环是先执行,再判断, 因此它至少执行一次
例子:还钱(难点)
多重循环(重点、难点)
将一个循环放在另一个循环体内,就形成了嵌套循环。
设外层循环次数为 m 次,内层为 n 次,则内层循环体实际上需要执行 m*n 次。
break语句
生成随机数的接口:
Matn.random();//生成0.0到1.0之间的double型数据
Matn.random()*100;//生成0.0到100.0之间的double型数据
(int)(Matn.random()*100);//生成0到99之间的整数
(int)(Matn.random()*100)+1;//生成1到100之间的整数
结束或者提前结束循环
流程图
细节:break可以通过标签指定结束哪一层的语句块,语法:break lable1;
for(int i = 1; i <= 100; i++),i只在这个for循环里有用,当跳出这个for循环后就输出i就会报错
判断字符串相等的语法 :"丁真".equals(name)
break第二道练习题注意点:先在循环开始前定义好变量name和passWord
Continue
continue 语句用于结束本次循环,继续执行下一次循环。
continue 语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环
基本语法
流程图
练习题
第一题
while(1 == 1)当循环条件为true时,进入无限循环,ctrl+c停止无限循环
第四题
水仙花数
一个五位数a
万位数为 a/10000;
千位数为a/1000%10;
百位数为a/100%10;
十位数为a/10%10;
个位数为 a%10;
四位数b
千位数为/1000;
百位数为b/100%10;
十位数为b/10%10;
个位数为 b%10;
三位数c
百位数为c/100;
十位数为b/10%10;
个位数为 b%10;
第六题:每五个一行
我写的代码
public class HomeWork06{
public static void main(String[] args){
int count = 0;
for(int i = 1; i <= 100; i++){
if(i % 5 != 0){
count++;
System.out.print(i + "\t");
}
if(count % 5 == 0){
System.out.print("\n");
}
}
}
}
输出效果
多一行空行的原因:
n = 24时 count = 20,执行第一,二个if,打印 24 并打印一个换行符。 n = 25时,第一个if不执行,此时count 还是25,执行第二个if,再次打印一个换行符。
解决办法:把第二个if嵌套在第一个if里
public class HomeWork06{
public static void main(String[] args){
int count = 0;
for(int i = 1; i <= 100; i++){
if(i % 5 != 0){
count++;
System.out.print(i + "\t");
if(count % 5 == 0){
System.out.print("\n");
}
}
}
}
}
n = 25时,外层if不执行,就不会出现上述情况
第七题
打印a-z和A-Z
char型变量可以直接运算,'b'='a'+1;'c'='a'+2;.....'z'='a'+25;同理大写
tips:1)int c1 = ; int c2 = 'a'
第八题
求1-1/2+1/3-1/4+...+1/99-1/100的和
初始代码
public class HomeWork08{
public static void main(String[] args){
//求1-1/2+1/3-1/4+...+1/99-1/100的和
//分两种情况,当i为奇数是1/i,当i为偶数时,-1/i
double sum = 0;
for(double i = 1; i <= 100; i++){
if(i % 2 != 0){
sum += 1/i;
}else if(i % 2 == 0){
sum -= 1/i;
}
}
System.out.print(sum);
}
}
运算结果为1.0
原因:sum += 1/i;1和都是int型数据,1/i的结果为0,赋值给double型数据sum,就是0.0
改正:1)sum += 1.0/i; 1.0为double型,1.0/i的结果也是double型
2)double i = 1;同上,1/i也变成了double型
第九题
求1+(1+2)+(1+2+3)+...+(1+2+..+100)的和
使用双重循环
public class HomeWork09{
public static void main(String[] args){
//求1+(1+2)+(1+2+3)+...+(1+2+..+100)的和
//使用双重循环,类似于九九乘法表
//外循环:
int sum = 0;
for(int i = 1; i <= 100; i++){
for(int j = 1; j <= i; j++){
sum = sum + j;
}
}
System.out.print("sum=" + sum);
}
}