预备知识
-
JDK用的是8
-
module相当于一个项目,多个mudule之间相互独立
-
project相当于一个工作站
-
src目录用来存储所有的源码
-
src要打上源代码根目录标签
语法
关键字
全部小写
标识符
只能由数字 或字母或 $或_ 组成且只不能以数字开头
命名规则
核心规则:见名知意
- 包
- 作用:将类按功能分类,保证相同类名不重复
- 单级包:com
- 多级包:com.xzk.a 域名反转法。创建需要先去掉齿轮中的一个勾
- 类和接口
- 单个单词:首字母大写其余全部小写 Max
- 多个单词:每个单词首字母大写,其余全部小写。 ChinaStu
- 变量和方法
- 单个单词:所有字母全部小写 min
- 多个单词:首个单词小写,后面的单词每个单词首字母大写。 chinaNoOne
- 常量
- 单个单词:全部大写
- 多个单词:全部大写且以_分割
注释
-
单行注释 //
-
多行注释
- /*内容*/
-
文档注释
/**内容*/
常量
- 字面常量
- 字符串常量 “nihao”
- 整型常量 1
- 字符常量 ‘我’ ‘a’
- 布尔常量 true or false
- 空常量 NULL
- 自定义常量
进制转换
System.out.println(0b1100) //表示二进制输出
System.out.println(011) //表示八进制输出
System.out.println(11) //表示十进制输出
System.out.println(0x11) //表示十六进制输出
原码:最高位为符号位的二进制码 弊端:符号位和数值位要分开计算
补码:符号位和数值位可以一起参与数值计算,内存中存在的形式,补码的补码就是原码
- 正数:原码和补码一样
- 负数:原码的数值位取反,符号位不变,然后+1
对0的思考
原码中
- 正 0000 0000
- 负 1000 0000
- 原码表示范围 -127~127
补码中:0000 0000
- 由于原码中0的表示有两个,所以让补码多表示一个负数,-128(字长为8),所以补码比原码多表示一个值
注:输出的值是原码转换而来,而计算机内存中存储的值,做运算的是补码
变量
数据类型
-
基本数据类型
-
数值型
-
整数型
类型 长度(字节) byte 1 short 2 int(整数默认) 4 long 8 -
浮点数型
类型 长度(字节) float 4 double(小数默认 ) 8
-
-
字符型 char
-
布尔型 boolean
-
-
引用数据类型
- 类class
- 接口interface
- 数组[]
赋值原则:
单个变量:不能超过能表示范围
变量的运算:不能由高精度向低精度赋值
转换规则:
-
低精度会自动向高精度转换 byte,short,char->int->long->float->double
-
boolean类型不能转换
-
强制转换格式 : (类型)(变量表达式)
-
byte,short,char相互之间不能转换,这三者之间运算,或者本类型与本类型运算会先转换为int型
面试题:
byte b1 = 1, b2 = 2, b;
b = b1 + b2; //两个byte类型参与运算,首先会被转换为int。
b = 1 + 2; //编译器简单的判断了一下,虽然是两个int型数据相加但是不会超出byte的表示范围
使用变量的注意:
-
有效范围只在所定义时的{}内
-
使用前要初始化
运算符
加减乘除操作
加法
// 1.加减乘除操作 +-*/
int number1 = 1;
int number2 = 2;
System.out.println(number1 + number2);
System.out.println(number1 * number2);
System.out.println(number1 / number2); //整除
System.out.println(number1 - number2);
// 拼接 只要操作数里面有一个字符串 +操作就是字符串拼接
System.out.println('a'+ 1); //这里算出来的是a的ascll码 +1
System.out.println("HELLO"+ 1);
System.out.println("HELLO"+ 1 + 'a'); // 字符串在第一个,所以依次作字符串拼接操纵
System.out.println(1 + 'a' + "HELLO"); // 字符串在后 所以先做完前面的运算 再拼接
System.out.println("5+5=" + 5 + 5);
System.out.println(5 + 5 + "=5+5");
除法 同c语言一样
//整数相除向下取整
System.out.println(number1 / number2); //整除
取余
int f = 5 % 3;
System.out.println(f);
科学计数法
同c e前e后必有数,且是整数
自增/减
//也和c一样
//练习
int a = 4, b;
b = (a++) + (++a) + (a * 10);
// b = 4 + 6 + 60 = 70
System.out.println(b);
赋值运算符
同c
关系运算符
基本上同c 多了一个 instanceof 检查是否是类的对象
逻辑运算符
//同c有一些不同
/*
&和&&都是与
&& 比较智能 会出发短路效应
& 这种与比较死板,即使第一个操作时已经是false,此时仍然会取计算第二个操作数,
在八计算好的两个操作数的结果,作与运算,得到最后的结果
||和|都是或 和与一样 ,||有短路效果
^异或
两个性质:
相同为0,0异或n等于n
!false true 互换
*/
int number3 = 1, number4 = 2;
/* boolean flag = (number3 > number4) & (number3++);
报错:operator & cant applied to boolean and int
原因:& 右边不是布尔类型, 执行的就是按位与。好像不能像c语言一样 直接判断非0的int型变量 为ture,
*/
boolean flag = (number3 > number4) & (number3++ != 1);
System.out.println(number3); // 2 说明操作数二被执行了,没有短路效应
boolean flag2 = (number3 > number4) && (number3++ != 1);
System.out.println(number3); // 2 说明第二个操作数没有执行
//表示一个范围时,和c一样,不能直接写成数学表达式, a<b<c
//关系运算符是逻辑运算符的操作数 所以关系运算符的优先级比逻辑运算符更高
位运算:
内容:左移<< 有符号右移>> 无符号右移>>> I & ^ ~
位运算是对补码进行的运算 且并没有改变原来变量得值,要改变必须赋值才行。
左移 <<
和c一样
带符号右移 >>
带符号右移 -2 >> 1,相当于操作数/2(只针对,未溢出,可以被2除尽的情况)
10000000.00000000.00000000.00000010
补码 11111111.11111111.11111111.11111119
补码右移1位 高位补符号位 11111111.11111111.11111111.11111111
转会原码显示 10000000.00000000.00000000.00000001 -》-1
溢出情况
-1 >> 1
原码: 10000000.00000000.00000000.00000001
补码: 11111111.11111111.11111111.11111111
右移: 11111111.11111111.11111111.11111111 //-1 不断移多少位都是-1
得: -1
故下溢
3 >> 1 = 1
00000000,00000000,00000000,00000011 -> 00000000.00000000.000000000.00000001 ->> 1
无符号右移 >>>
最高位进位0 用来处理正整数
按位与 或 异或 非 同c
异或运算得性质
一个数和它自己异或一定是0
0和任何数异或都是这个数本身: 0 ^ a = a
按位取反~(包括符号位都取反)
//验证一下异或性质
// 性质1 一个数和它自己异或一定是0
int number5 = 5, number6 = 0;
System.out.println(number5 ^ number5); // 相同为0
System.out.println(number6 ^ number5); // 0与任何数异或都是那个数
位运算练习
//1: 请用最有效率的方式写出计算2*8的结果
System.out.println(2 << 3);
//2: 请自己实现两个参数变量的交换
//四个方法
//1.临时temp中间变量交换 (实际开发使用)
//2.+--两数做差交换
//3.位运算 异或交换
//4.一句话解决
//方法三:利用异或性质交换
int number7 = 7, number8 = 6;
/*
number7: 00000000.00000000.00000000.00000111
number8: 00000000.00000000.00000000.00000110
*/
number7 = number7 ^ number8;
number8 = number7 ^ number8; // number7 = number7 ^ number8 ^ number8 结合律加异或运算的性质
number7 = number7 ^ number8; // number8 = number7 ^ number8 ^ number7
System.out.println(number7);
System.out.println(number8);
//方法四:一句话就很猛
int number9 = 10, number10 = 200;
number9 = (number9 + number10) - (number10 = number9);
System.out.println(number9);
System.out.println(number10);
//ctrl + alt + l 自动调整选中的代码格式
//ctrl + shift + / 选中行注释
//ctrl + / 选中行使用单行注释
//注:java运算符的优先级
//不用记 为了代码的可读性 多用括号达到想要的效果
键盘录入:
public class Structure {
public static void main(String[] args){
//键盘录入数据,必须通过scanner 对象来使用其功能
Scanner sc = new Scanner(System.in);
Scanner strsc = new Scanner(System.in);
//接受输入
int i = sc.nextInt();// 输出一个字符串常量
System.out.println(i);
String str = strsc.nextLine(); // 输入一个字符串常量
System.out.println(str);
boolean b = sc.nextBoolean();
System.out.println(b);
sc.close(); // 对象用完要关闭??
//注意点:
//nextBoolean 和 nextInt 都是以空格,回车为分隔
//nextLine 以回车作为数据的分隔符
//推荐做法:
//如果既要读取普通数据,也要读取字符串nextLine(读取一行字符串),用两个Scaner对象
//如果导入别人的项目时,遇到了compiler output 就要设置中Project structure -》project中修改 output路径
//没有可以自己新建一个out目录
}
}
程序结构:
顺序结构
没啥好说的,顺序执行
选择结构
基本上也和c没啥差别,做两道练习题就吧。
一下要点
- 三目运算符和双分支结构的异同
- 两个双分支语句练习题
- 两个switch语句练习题
- if esle 语句与switch语句不同的应用场景
package sequential;
import java.util.Scanner;
public class demo1 {
public static void main(String[] args){
/*
选择结构 同c
注意 三目运算符和双分支结构语义基本相同
但是三目运算符的运算结果必须要有值
if条件分支练习
if的条件必须是boolean类型的结果
// 1:x和y的关系满足如下:
x>=3 y = 2x + 1;
-1<=x<3 y = 2x;
x<=-1 y = 2x – 1;
*/
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
int y;
if (x >= 3) {
y = 2 * x + 1;
}
else if (x <= -1) {
y = 2 * x - 1;
}
else {
y = 2 * x;
}
System.out.println("x = " + x + "时:y = " + y);
// 2.三者取大
int a = 100, b = 99, c = 80, temp;
if (a > b){
temp = a;
}
else
temp = b;
temp = temp > c ? temp : c;
System.out.println(temp);
// switch语句
// 注意事项
// 1.switch 表达式的结果类型
// 表达式的取值:byte,short, int, char
// JDK7以后可以是:string 字符串
// 2.case 后面的值不能相等,必须得是常量值,必须和表达式的类型一致
// 练习题
// 1.用switch实现单项选择
Scanner sc2 = new Scanner(System.in);
String str = sc2.nextLine(); // 输入的字符串
char d = str.charAt(0); //读取字符串的首字符
switch (d){
case 'A': System.out.println("宁的女神是:卢本伟"); break;
case 'B': System.out.println("宁的女神是:赵本山"); break;
case 'C': System.out.println("宁的女神是:刘德华"); break;
case 'D': System.out.println("宁的女神是:高圆圆"); break;
case 'R': System.out.println("宁的女神是:baby"); break;
case 'F': System.out.println("宁的女神是:范冰冰"); break;
default: System.out.println("宁没有女神"); break;
}
// 2.输入月份 输出季节
//Scanner sc3 = new Scanner(System.in);
int mouth = sc.nextInt();
switch (mouth){
case 12: case 1: case 2:
System.out.println("冬季"); break;
case 3: case 4: case 5:
System.out.println("春季"); break;
case 6: case 7: case 8:
System.out.println("夏季"); break;
case 9: case 10: case 11:
System.out.println("秋季"); break;
default:
System.out.println("没有这个月份"); break;
}
// if和switch的使用场景
//if的使用场景
// 针对结果是boolean类型的判断
//分支对应多个表达式的多个取值
//switch的使用场景
//针对结果是固定类型的判断
//表达式的取值范围只是固定的离散值集合,分支对应表达式的某一种取值
}
}
循环结构
和c语言基本上一样
注意点:
- 增强形式的for循环
- 循环跳转语句和标签
public class supplemnt {
public static void main(String argc[]){
// 增强形式的for循环
// 定义一个数组
int[] array = {1, 2, 3, 4};
// 增强形式for循环
for (int element : array){ // 只能从左到右遍历数组 无法灵活控制
System.out.println(element);
}
// 跳转控制语句 break continue return
// 默认情况下break只跳出一层循环
// 终止任意层循环,需要再被终止的最外层循环的前面一句,打标签 break 标签 -》 标签:
// coutinue 一般和if 一起使用。 continue 也可以+标签 等同于 break
// return 退出当前方法(函数)
}
}
代码规范
1.变量要描述清楚 用小写字母和下划线
2.一行代码不要太长
3.函数体前面空两行
4.每一个分支 或者循环语句 上下留一行 最内部的代码段不空行
5.带形参的函数都要写函数文本描述
6.# 注释在代码后面空两格 离注释语句空一个
7.不可混合缩进
8.代码格式统一
9.注释 描述功能
10.函数体短 好一些 利于顺应需求变更
11.readme 文档
12.按照团队代码规范写,便于共同开发
13.少定义全局变量
14.注释尽量写英文。层次有限就中文也可。
15.类名用大驼峰命名法 XiongZhiKang
如有错误之处,多多指教。