边学边记
《【零基础 快速学Java】韩顺平 零基础30天学会Java》 www.bilibili.com/video/BV1fh…
概述
依赖
【Java开发工具包】 JDK(Java Development Kit) = JRE + Java开发工具(包含java、javac、javadoc、javap等)
【Java运行环境】 JRE(Java Runtime Environment) = JVM(Java Virtual Machine) + Java核心内库
下载JDK8
配置环境变量
- 我的电脑 -> 环境变量
- 添加 JAVA_HOME 和 jdk8的安装目录
- 修改 path 添加
%JAVA_HOME%\bin
Hello World
- Hello.java
public class Hello {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
- 编译
Hello.java源文件
javac Hello.java
3. 运行 Hello.class 字节码文件
java Hello
文档注释
- 类、方法的注释,使用 javadoc 的文档注释
- 非 javadoc 注释,是对代码的说明,给程序维护者看的
- 文档注释
/**
* @author OY
* @version 1.0
*/
public class Test {
public static void main(String[] args) {
System.out.println("书名\t作者\t价格\t销量");
System.out.println("三国\t罗贯中\t120\t1000");
}
}
- 生成文档
javadoc -d C:\JavaCode\doc -author -version Test.java
变量
数据类型
- 基本数据类型(8种)
- 数值型
- 整数类型
byte[1] short[2] int[4] long[8] - 浮点小数类型
float[4] double[8]
- 整数类型
- 字符型
char[1] - 布尔型
boolean[1]
- 数值型
- 引用数据类型(3种)
- 类
class - 接口
interface - 数组
[]
- 类
整数类型
- 一般声明整数
int类型就足够了 - 如果声明
long类型后面需加 l 或 L 例:long n1 = 1L - 【1byte = 8bit】
byte是基本存储单元bit是最小存储单位
浮点类型
- 通常情况下使用
double类型,浮点数(例1.1)默认就是double类型 - 如果声明
float类型后面需加 f 或 F 例:float n1 = 1.1F double比float精度更高,float会切掉后面的小数- 浮点数对比陷阱: 2.7 不等于 8.1/3
字符类型
- 字符类型必须使用单引号
''例:char c1 = 'a' - 字符本质就是整数
char c1 = 'a';
System.out.println((int)c1);// 97
- 输出整数显示对应的ASCII码表的字符
char c1 = 97;
System.out.println(c1);// a
- 字符可以直接运算
System.out.println('a' + 1)// 97 + 1 输出 98
- 字符类型类型计算后输出对应的ASCII码表的字符
char c1 = 'a' + 1;// 97 + 1
System.out.println(c4);// b
布尔类型
boolean占一个字节- 只有
ture和false没有null Java里不可以用0或者非0整数代替ture和false
数据类型转换
自动类型转换
- 多种类型数据混合计算,会转换成最大的
int n1 = 10;
double d1 = n1 + 1.1;// 因为 1.1 是 double 类型 自动转换成 double 类型
float d1 = n1 + 1.1F;// 上同理 自动转换成 float 类型
- 精度大的赋值给小的会报错
int n1 = 1.1;// 报错 1.1 是 double 类型比 int 类型大
int n2 = 1;
byte b1 = n2;// 报错 int 不能放入 byte
- (
byte和short) 不能和char互相转换
byte b1 = 1;
char = b1;// byte 不能转换成 char
- (
byte和shart) 和char三者可以计算会自动转换成int
byte b1 = 1;
short s1 = 1;
int n1 = b1 + s1;// 计算会自动转换成 int 类型
byte b2 = 1;
byte b3 = 2;
int b4 = b2 + s3;// 自身计算也会自动转换成 int 类型
boolean不参与类型转换
boolean isPass = true;
byte b1 = isPass;// 报错 无法转换
- 多种类型自动转换精度最大的
byte b1 = 1;
short s1 = 2;
int i1 = 3;
double d1 = 1.1;
double b1 + s1 + i1 + d1;// 转换精度最大的 double
强制类型转换
- 使用强制转换符
()会造成精度损失和数据溢出,谨慎使用。
int n1 = (int)1.9;// 1.9 强制转换成 int 输出 1 精度损失
int n2 = 2000;
byte b1 = (byte)n2;// 输出 -48 数据溢出
- 使用小括号提升优先级
int n1 = (int)3.5*6+6*1.5;// 错误
int n1 = (int)(3.5*6+6*1.5);
char类型可以保存int类型常量值 但不可以保存int类型变量值
char c1 = 100;// int 类型常量值 OK
int n1 = 100;
char c2 = n1;// int 类型变量值 NG
char c3 = (char)n1;// 强制转换 OK
String 类型转换
- 基本数据类型转
String加双引号即可""
int n1 = 100;
float f1 = 1.1F;
boolean b1 = true;
String s1 = n1 + "";// int 转换成 String
String s2 = f1 + "";
String s3 = b1 + "";
String转换成基本数据类型 通过包装类调用 parseXX 方法
String s1 = "123";
byte b1 = Byte.parseByte(s1);// 123
short s1 = Short.parseShort(s1);// 123
int n1 = Integer.parseInt(s1);// 123
long g1 = Long.parseLong(s1);// 123
float f1 = Float.parseFloat(s1);// 123.0
double d1 = Double.parseDouble(s1);// 123.0
boolean b2 = Boolean.parseBoolean("true");// true
String转换成基本数据类型 要确保数据类型正确
String s1 = "hello";
byte b1 = Byte.parseByte(s1);// 编译OK 运行NG
运算符
算术运算符
+加-减*乘/除法
System.out.println(10 / 4);// 在 java 里整数除整数只保留整数 输出 2
System.out.println(10.0 / 4);// 在 java 里浮点数除整数 输出 2.5
double d1 = 10 / 4;// 整数除整数只保留整数 2 然后因为是 double 类型
System.out.println(d1);// 输出 2.0
%取模 取余数 本质公式:a % b = a - a / b * b
System.out.println(10 % 3);// 1
System.out.println(-10 % 3);// -1
System.out.println(10 % -3);// 1
System.out.println(-10 % -3);// -1
++作为独立的语句使用2者一样结果
int n1 = 10;
n1++;// 自增 输出 10
int n2 = 10;
++n2;// 自增 输出 10
作为表达式使用2者不同
int n1 = 8;
int n2 = ++n1;// 先自增再赋值 n1 = n1 + 1; n2 = n1;
System.out.println(n2);// 输出 9
int n3 = 8;
int n4 = n3++;// 先赋值再自增 n4 = n3; n3 = n3 + 1;
System.out.println(n4);// 输出 8
--规则同上
关系运算符
也叫比较运算符,结果 ture 或者 false,通过关系表达式 if 来实现
int n1 = 8;
int n2 = 9;
System.out.println(n1 == n2);// 输出 false
System.out.println(n1 != n2);// 输出 true
System.out.println(n1 > n2);// 输出 false
逻辑运算符
&逻辑与 a 为false的话 b 还会运行&&短路与 a 为false的话 b 不再判断运算运行(效率高|逻辑或 a 为true的话 b 还会运行||短路或 a 为true的话 b 不再判断运算运行(效率高!取反true变false反之false变true^逻辑异或 a 和 b 不同时true反之false
赋值运算符
将运算后的值,赋给制定的变量
- 基本赋值运算符
= - 复合赋值运算符
+=-=*=/=%=
a += b;// 等于 a = a + b
- 复合赋值运算符会进行类型转换
byte b1 = 3;
b1 = b1 + 2;// 会报错 因为 2 是 int 类型
b1 += 2;// 等于 b1 = (byte)(b1 + 2)
三元运算符
条件表达式 ? ture运行表达式1 : false运行表达式2;
运算符优先级
优先顺序从上到下
. () {} ; ,- 单目运算符,并且是从右往左运算的
- 算术运算符
- 移位运算符
- 比较运算符
- 逻辑运算符
- 三元运算符
- 赋值运算符
标识符规则
凡是可以自己命名的地方都叫标识符
- 不能数字开头
- 不能直接使用关键字和保留字
- 区分大小写
标识符规范
- 包名:全部英文字母小写
aaa.bbb.ccc - 类名:所有单词首字母大写(大驼峰)
AaaBbbCcc - 变量名/方法名:第一个单词首字母小写,后面单词首字母大写(驼峰)
aaaBbbCcc - 常量名:全部英文字母大写,多个英文单词用下划线分割
AAA_BBB_CCC
键盘输入
首次出现引入包的概念 import java.util.Scanner;
import java.util.Scanner;
public class Input01 {
public static void main(String[] args) {
Scanner myScanner = new Scanner(System.in);
System.out.println("请输入姓名");
String name = myScanner.next();
System.out.println("姓名:" + name);
}
}
进制
二进制
0,1,满2进1,以0b开头
int n1 = 0b1010;// 10
十进制
0~9,满10进1
int n1 = 1010;// 1010
八进制
0~7,满8进1,以0开头
int n1 = 01010;// 520
十六进制
0~9以及a(代表10)~f(代表15),满16进1,以0x开头
int n1 = 0x1010;// 65793
进制的转换
必学基本功
- 二进制转十进制
从右往左,提取数 x 2(位数-1)次方,然后求和。
0b1011 = 1 x 2(1-1)次方 + 1 x 2(2-1)次方 + 0 x 2(3-1)次方 + 1 x 2(4-1)次方
结果 1 + 2 + 0 + 8 = 11
- 八进制转十进制
从右往左,提取数 x 8(位数-1)次方,然后求和。
0234 = 4 x 8(1-1)次方 +3 x 8(2-1)次方 + 2 x 8(3-1)次方
结果 4 + 24 + 128 = 156
- 十六进制转十进制
从右往左,提取数 x 16(位数-1)次方,然后求和。
0x23A = 10 x 16(1-1)次方 +3 x 16(2-1)次方 + 2 x 16(3-1)次方
结果 10 + 48 + 512 = 570
- 十进制转二进制
2除以该值,直到商等于0,然后把每次获得的余数倒过来,获取二进制
34 = 0b00100010 一个字节有8位前面要补2个0
- 十进制转八进制
8除以该值,直到商等于0,然后把每次获得的余数倒过来,获取二进制
- 十进制转十六进制
16除以该值,直到商等于0,然后把每次获得的余数倒过来,获取二进制
237 = 0xed
- 二进制转八进制
从右边开始每三个一组视为二进制,转成对应的八进制
0b11010101 = 11(3) + 010(2) + 101(5)
结果 0325
- 二进制转十六进制
从右边开始每四个一组视为二进制,转成对应的八进制
0b11010101 = 1101(d) + 0101(5)
结果 0xd5
- 八进制转二进制
从右边开始每一个数,转成一个3位二八进制
0237 = 2(010) + 3(011) + 7(111)
结果 0b237
- 十六进制转二进制
从右边开始每一个数,转成一个4位二八进制
0x23b = 2(0010) + 3(0011) + b(1011)
结果 0b001000111011
位运算
& | ^ ~ >> << >>>