尚硅谷JAVA Bilibili
自己之前学过python,所以这份笔记总体上记录自己觉得的新东西
一、关键字和保留字
1. 关键字
class if public 等
特点:所有字母都小写
2. 保留字
goto、const
二、标识符
定义:各种名字
规则(必须遵守):
- 字母大小写、数字、_ 、$ 组成
- 数字不可开头
- 区分大小写,长度不限
- 不可关键字保留字(可包含)
- 不能含空格
规范(建议遵守:见名知意):
- 包名:xxxyyyzzz
- 类名、接口名:XxxYyyZzz
- 变量名、方法名: xxxYyyZzz
- 常量名:XXX_YYY_ZZZ
三、变量
//example
class VariableTest {
public static void main(String[] args){
int myAge = 12; //变量的定义(声明+赋值)
System.out.println(myAge);
}
}
1. 基本数据类型
基本数据类型
- 数值型: 整数类型(byte1,short2,int4,long8); 浮点类型(float4,double8) --“数字为字节数”
- 字符型(char2):定义通常用英文单引号,只能且必须写一个字符 | ‘\n’:换行符 ; ‘\t’:制表符;’\u0043’: 对应C
- 布尔型(boolean)
- 变量或常量: 整型默认int, 声明long后加l或者L
- 浮点型默认double, 声明float后加f或者F
- 举例:terminal默认GBK解析,存的时候就要用ANSI存,防止乱码
- 想输出123"456"789\n需要"123"456"789\n"
引用数据类型
- 类(class): 字符串在这里
- 接口(interface)
- 数组([])
2. 基本数据类型变量间转换
自动类型提升
byte char short -> int -> long -> float -> double
前三种怎么运算结果都是int
强制类型转换
自动类型提升的逆运算
double d1= 1.9
int i1= (int)d1 // i1 --1 截断,损失精度
long l = 12232
//未加L并不会报错,其实是将其看作int
long l = 2313123213213213213213
//超出int表示范围,报错
float f1 = 1.2
//报错,因为不加F默认为double, double转float必然报错(大转小)
// float f1 = (float)1.2 可解
byte b = 12
byte b1 = b +1 //1 作为整型常量默认int 另外 1.1 作为浮点型常量默认double
3. 基本数据类型与String间转换
string
不是基本数据类型,是引用数据类型
String 可以和八种基本数据类型运算,且只能说hi连接运算,且结果类型仍为String
String str1 = "123"
int num1 = str1 // 报错
int num2 = (int)str1 // 报错
// 因为String不参与上述类型转换等运算
// 正确做法
int num 3 = Interger.parseInt(str1)
4. 进制间转换
对于整数
- 二进制 binary: 0b 0B
- 八进制 octal: 0
- 十进制 decimal
- 十六进制 hex: 0x 0X
int 128 强转 byte , 得 -128
4 运算符
算术运算符
// /
int num1 = 12
int num2 = 5
double result = num1 / (num2 + 0.0) //2.4
// % 取模运算
// 结果的符号与被模数符号相同
int m1 = -12
int m2 = 5
int m3 = m1 % m2 // -2 与-12符号同,就算m2是-5也是如此
// ++
++i //先+1再i(赋值)
i++ //先i(赋值)再+1
// 另外注意自增1不会改变变量本身数据类型,效率更高
short i = 2
i = i + 1 //报错,因为1为int型
赋值运算符
//+= 不会改变变量本身的数据类型
short i = 1
i = i + 2 //报错,自动转成int
i += 2 //正确,不改变数据类型
//练习
int n = 10
n += (n++) + (++n) //32
// 即 n = n + (n++) + (++n) = 10 + 10 + 12
到(n++)之后n已经成为11,所以后面(++n)时加的是12
比较运算符
// == != <= 等
// instanceof 检查是否为类的对象
//结果都为boolean型
逻辑运算符
& 逻辑与
&& 短路与
| 逻辑或
|| 短路或
!逻辑非
^ 逻辑异或
//& 与 && 的区别
// 当符号左边是false时,&会继续执行右边的运算,&&则不会(因为一个false就知道结果了)
//| 与 || 同理
位运算符
& 左右如果是boolean,则是逻辑与
左右如果是整数,则是与运算
//高效计算2*8
2 << 3 或者 8 << 1
// 练习 交换变量的值
int num1 = 10
int num2 = 20
num1 = num1 + num2
num2 = num1 - num2
num1 = num1 - num2
// 节省内存空间,但可能会溢出,且非数值型不支持加减
//方法2
num1 = num1 ^ num2
num2 = num1 ^ num2
num1 = num1 ^ num2
// 节省内存空间,但非数值型不支持加减
方法2 背后原理
三元运算符
(条件表达式)? 表达式1 : 表达式2
如果条件表达式为true则执行表达式1,反之表达式2
要求表达式1和表达式2类型统一,方可用统一的变量接收
m = 10
n = 20
String maxStr = (m > n) ? "m大" : ((m == n) ? "m等于n " : "n大") //可嵌套
凡是可以使用三元运算符的地方都可以改写成if-else, 反之不行(if-else结构更复杂)
但相比来说三元运算符简洁且运行效率高(能用则用)
五、程序流程控制
顺序结构
分支结构
if else
// 导包,实例化,调用方法 SCAN
import java.util.Scanner;
class Test{
public static void main(String [] args){
Scanner scan = new Scanner(System.in);
int num = scan.nextInt();
System.out.println(num);
//没有nextChar,需要用如下方法获取一个字符(在一个字符串中获取索引为0的字符)
String gender = scan.next();
char genderChar = gender.charAt(0);
System.out.prinln(genderChar);
}
}
// 要求: 产生随机数: 10-99
// 公式:[a,b] :(int)(Math.random()*(b-a+1)+a)
class Test{
public static void main(String [] args){
//double value = Math.random(); // [0.0,1.0)
// 需要处理成10-99
//首先Math.random() * 90 --> [0.0,90.0), 然后再加10,变[10.0,100.0),然后int强转即可
int value = (int)(Math.random()*90+10);
System.out.println(value);
}
}
switch-case
// 表达式只能是一下六种类型
// byte, short, char, int, 枚举类型, String类型
// 如果语句1。。。语句n相同,则考虑合并
// break 是可选的,视情况而定
// 如果可以与if-else相互替代且写起来不负责,使用switch-case(效率稍高)
switch(表达式){
case 常量1:
语句1;
break;
}
...
case 常量n:
语句n;
break;
}
default:
语句;
break;
循环结构
for 循环
① 初始化条件
② 循环条件(boolean)
③ 循环体
④ 迭代条件
for(①;②;④){
③
}
① -> ② -> ③ -> ④ -> ② -> ③ -> ④ -...- ②
while循环
// for 和 while 初始化条件中的变量的作用范围不同
①
while(②){
③
④
}
① -> ② -> ③ -> ④ -> ② -> ③ -> ④ -...- ②
do while 循环
①
do{
③;
④;
}while(②)
① -> ③ -> ④ -> ② -> ③ -> ④ -> ② -...- ②
// 相比for 和 while 至少也执行一次③④,如果执行多次则没有区别
for(;;){}与while(true){}效果相同
//结束循环的方式
//一、循环条件返回false
//二、循环体中执行break
嵌套循环
//外层控制行数,内层控制列数
break,continued的使用
都使用在循环中,break结束当前循环(默认当前最近的循环 ),continue结束当次循环(默认当前最近的循环 )
另外两者后面都不能有执行语句
那么如何结束指定循环?
label:for (int i =1; i <= 4; i++){
for (int j = 1; j <= 10; j++){
if (j % 4 == 0){
break label; //结束指定标识的一层,continue同理
}
}
}
over
接下来是第三章 数组