【零基础 快速学Java】学习笔记

174 阅读9分钟

边学边记

《【零基础 快速学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

www.oracle.com/cn/java/tec…

配置环境变量

  1. 我的电脑 -> 环境变量
  2. 添加 JAVA_HOME 和 jdk8的安装目录 image.png
  3. 修改 path 添加 %JAVA_HOME%\bin image.png

Hello World

  1. Hello.java
public class Hello {
	public static void main(String[] args) {
		System.out.println("Hello World!");
	}
}
  1. 编译 Hello.java 源文件
javac Hello.java

3. 运行 Hello.class 字节码文件

java Hello

文档注释

  • 类、方法的注释,使用 javadoc 的文档注释
  • 非 javadoc 注释,是对代码的说明,给程序维护者看的
  1. 文档注释
/**
 * @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");
	}
}
  1. 生成文档
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
    • 数组 []

整数类型

image.png

  • 一般声明整数 int 类型就足够了
  • 如果声明 long 类型后面需加 lL 例:long n1 = 1L
  • 【1byte = 8bit】 byte 是基本存储单元 bit 是最小存储单位

浮点类型

image.png

  • 通常情况下使用 double 类型,浮点数(例 1.1)默认就是 double 类型
  • 如果声明 float 类型后面需加 fF 例:float n1 = 1.1F
  • doublefloat 精度更高,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 占一个字节
  • 只有 turefalse 没有 null
  • Java 里不可以用0或者非0整数代替 turefalse

数据类型转换

image.png

自动类型转换

  • 多种类型数据混合计算,会转换成最大的
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
  • (byteshort) 不能和 char 互相转换
byte b1 = 1;
char = b1;// byte 不能转换成 char
  • (byteshart) 和 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

运算符

算术运算符

image.png

  • +
  • -
  • *
  • / 除法
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 来实现

image.png

int n1 = 8;
int n2 = 9;
System.out.println(n1 == n2);// 输出 false
System.out.println(n1 != n2);// 输出 true
System.out.println(n1 > n2);// 输出 false

逻辑运算符

image.png

  • & 逻辑与 a 为 false 的话 b 还会运行
  • && 短路与 a 为 false 的话 b 不再判断运算运行(效率高
  • | 逻辑或 a 为 true 的话 b 还会运行
  • || 短路或 a 为 true 的话 b 不再判断运算运行(效率高
  • 取反 truefalse 反之 falsetrue
  • ^ 逻辑异或 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;

运算符优先级

image.png

优先顺序从上到下

  1. . () {} ; ,
  2. 单目运算符,并且是从右往左运算的
  3. 算术运算符
  4. 移位运算符
  5. 比较运算符
  6. 逻辑运算符
  7. 三元运算符
  8. 赋值运算符

标识符规则

凡是可以自己命名的地方都叫标识符

  • 不能数字开头
  • 不能直接使用关键字和保留字
  • 区分大小写

标识符规范

  • 包名:全部英文字母小写 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);
	}
}

进制

image.png

image.png

二进制

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位前面要补20

image.png

  • 十进制转八进制
8除以该值,直到商等于0,然后把每次获得的余数倒过来,获取二进制
  • 十进制转十六进制
16除以该值,直到商等于0,然后把每次获得的余数倒过来,获取二进制
237 = 0xed

image.png

  • 二进制转八进制
从右边开始每三个一组视为二进制,转成对应的八进制
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

位运算

& | ^ ~ >> << >>>

原码 反码 补码(重点难点)

image.png