后续内容在《Java SE基础学习笔记2》,还没写完
内容有点乱,可能还有错误,会经常修改的
推荐黑马的Java教程B站链接
面试可能会问
面向对象 跨平台 最重要
面向对象三大基本特征:封装,继承,多态
平台:指的是操作系统
即 Windows、Mac、Linux
跨平台:Java程序可以在任意操作系统上运行
前提:程序中有Java的运行环境
JRE
是Java程序的运行时环境,包含JVM和运行时所需要的核心类库
想要运行一个已有的Java程序,那么只需安装 JRE 即可
JDK
是Java程序开发工具包,包含JRE和开发人员使用的工具
其中的开发工具:编译工具(javac.exe)和运行工具(java.exe)。我们想要开发一个全新的Java程序,那么必须安装JDK。
JDK、JRE和JVM的关系
JDK:开发用的,包含开发工具和JRE
JRE:运行Java程序用的,Java运行时环境,包含类加载器
JVM:java程序真正运行的地方,在不同的操作系统上,需要提供具有相同功能的JVM
卸载JDK,不卸载的没法安装新的
这两个都要卸载
jdk 目录里面的重要文件
目录名称 | 说明 |
---|---|
bin | 该路径下存放了 JDK 的各种工具命令 javac 和 java 就放在这个目录 |
操作 | 说明 |
---|---|
盘符名称: | 盘符切换 E:回车,表示切换到E盘 |
dir | 查看当前路径下的内容 包括子文件和子文件夹 |
cd目录 | 进入单级目录 cd itheima |
cd … | 回退到上—级目录 |
cd 目录1 目录2 … | 进入多级目录 cd itheimaavaSE |
cd \ | 回退到盘符目录 |
cls | 清屏 |
exit | 退出命令提示符窗口 |
命令提示符窗口中 Ctrl + C 可以结束 死循环
开发 Java 程序,需要使用 JDK 提供的开发工具,而这些工具在 JDK 的安装目录的 bin 目录下
为了在开发 Java 程序的时候,能够方便的使用 java 和 javac 这些命令,需要配置 Path环境变量
JAVA_ HOME 新建
?:\ …\jdk-11
Path 编辑
%JAVA_HOME%\bin
别忘了移到最上面
开发Java程序,需要三个步骤:①编写程序 ②编译程序 ③运行程序
pub1ic c1ass He11oor1d { pub1ic static void main(String[]args){ System out.println("Heiioworid"); } )
先 javac 编译这个文件
通过编译器编译成字节码文件.class
再 java 执行文件
在 Window 操作系统中 文件名 不 区分大小写
面试时经常考 JVM Java 虚拟机 和 JDK 、 JRE
概述
分类
注释 | 格式 |
---|---|
单行注释 | // 注释信息 |
多行注释 | / * * 注释信息 */ |
文档注释 | /** * 注释信息 */ |
文档注释:
案例
/* Java程序中最基本的组成单位是 类 类的定义格式: public class 类名 { ) */ // 这是我定义的 Helloworld 类 public class Helloworld { /* 这是 main 方法 main 方法是程序的入口方法 代码的执行是从main方法开始的 */ public static void main (String[] args){ System.out.println ("HelloWorld"); } }
概述
关键字 就是被 Java语言 赋予了 特定含义 的单词
特点
48 个关键字
数据类型: void, byte, short, int, long, float, double, char,boolean
权限修饰符: public, protected, private类型定义: class, interface, enum
类的修饰符: static, abstract, final,
流程控制: if, else, for, while, do, switch, case, default, break,continue, return, try, catch, finally
3 个常量值 true false null
2 个保留字 const goto
标识符就是给 类 , 方法 ,变量 等起名字的符号
概述
常量 是在程序运行过程中,其值 不发生改变 的量
分类
System.out.println (null); // 报错
数据类型,页内跳转
Java语言是 ==强类型语言== ,对于每一种数据都给出了明确的数据类型,不同的 ==数据类型== 也分配了不同的 ==内存空间==,所以它们表示的 ==数据大小== 也是不一样的
很重要
E+38 表示是乘以10的38次方
E-45 表示乘以10的负45次方
科学计数法
156700
前面的数超过6位会造成精度的丢失 ↓
近似值 产生的 精度误差
所有 浮点数 都有这种情况
强类型语言 是一种强制类型定义的语言,一旦某一个变量被定义类型,如果不经过强制转换,则它 永远 就是该数据类型了
强类型语言包括 Java 、 Python 、 C++ 等
弱类型语言 是一种弱类型定义的语言,某一个变量被定义类型,该变量可以根据环境变化 自动进行转换 ,不需要经过显性强制转换
弱类型语言有 JavaScript 、PHP 等
概述
变量 是在程序运行过程中,其值可以发生改变的量
从 本质 上讲,变量是 内存 中—小块区域
格式:数据类型变量名 = 变量值
范例:
inta = 10; // 下面这两种都对 int i, j; int m = 5, n = 10; i = j = 10; // i = ( j = 10 ) int x = y = 10; // 报错,y 没定义 int a, b = a = 10; // 这个是可以的
语法:final 数据类型 常量名;
范例:
final f1oat PI = 3.14;
注意
常量 赋值 过了就不能再 赋值了
PI = 3.1415; // 报错
取值格式:变量名
例如:
a
修改值格式:变量名 = 变量值;
例如:
a = 20;
使用注意事项
long l = 10000000000; // 报错 long l = 10000000000L; // 输出 10000000000 System.out.println(l);
整数 默认的是 int 类型
long类型的变量定义的时候,为了防止整数过大,后面要加 ( L )
float f = 13.14; // 报错 float f = 13.14F; // 13.14 system.out.println(f) ;
浮点数 默认的是 double 类型
float 类型的变量定义的时候,为了防止类型不兼容,后面要加 (F)
类型转换 分为 自动类型转换 和 强制类型转换
boolean 不能与其它类型进行转换
默认值
把一个表示 数据范围小 的 数值 或者 变量 赋值给另一个表示 数据范围大 的变量
例如:
doubled = 10;
转换顺序
byte => short => int => long => float =>double
short s = 'a'; // 好像是 char 自动转换成short类型 char c = 'a'; s = c; // 报错,说明 char 是不能自动转换成short类型的
其实是 s 的数据类型 是 int
案例:
正确
double d = l0 ; // int → double system.out.println (d) ; // 输出 10.0 // 定义byte类型的变量 byte b = 10 ; short s = b ; // byte → short int i = b ; // byte → int char c = b ; // 报错 byte → char 无法转换
把一个表示 数据范围大 的 数值 或者 变量 赋值给另一个表示 数据范围小 的 变量
格式:目标数据类型 变量名 = (目标数据类型)值 或者 变量;
这个 值 或者 变量 的 数据范围 一定要比 目标数据类型 的数据范围要大
注意: 数据可能会丢失 / 数据溢出
long l = 2200000000L; Float f1 = 1.5f; byte b1 = 10; char c1 = (char)b1; System.out.println(c1); short s1 = 128; //十进制如何转换成二 byte b2 = (byte)s1; // -128 System.out.println(compare(1,2)); compare(1,2) // int compare((byte)1,(byte)2) // byte compare((short)1,(short)2) // short compare(1L,2L) // long
特殊情况:
int k = (int)88.88; // 88.88 是浮点数 System.out.println(k); // 88
位置很重要
当遇到复杂的运算时可以加 括号 括起来
int a = 1; int b = 1; --a++; // 报错 a +++ b; // a++ + b a ++++ b; // 报错 a ++-++ b; // a++ - ++b // 中间的 +- 可以放无限个 a ++-+-+-+-++ b; // (a++) - (+ - + - + - (++b)) // 1 - (- - - 2) = 3
不同 运算符 连接的 表达式 体现的是不同类型的 表达式
int a = 10; int b = 20; int c = a + b;
+:是 运算符 ,并且是 算术运算符
a + b:是 表达式 ,由于+是 算术运算符,所以这个表达式叫 算术表达式
数据类型
在运算时 低 数据类型向 高 数据类型
1.在运算中, char、byte 和 short 类型,会自动转换成 int计算
short s1 = b1 +10; // 报错,s1 是 int类型 byte b1 = 10; byte b2 = 20; short s1 = b1; // 不报错,s1 没进行运算,所以是 short型 short s2 = b1 + b2; // 报错,s2 是 int类型
2.当表达式中,是两个常量值运算,在编译时将两个值直接运算
short s4 = 'a' + 'b'; // √ // 97 + 98 = 195 // short s4 = 195 符合语法 char c1 = 'a'; char c2 = 'b'; short s5 = c1 + c2; // 报错
整数 相除 ( % ) 只能得到 整数 ,要想得到 小数 ,必须有 浮点数 的参与
System.out.println (6 / 4); // 1 System.out.println (6.0 / 4); // 1.5 System.out.println( 10.5 % 3.3 ); // 10.5/ 3.3 = 3 ..... 0.6 // 实际上为 0.6000000000000005 // 被转换成 double System.out.println(-11 % 3); // -2 System.out.println(11 % -3); // 2 System.out.println(-11 % -3); // -2
算术表达式 中包含多个 基本数据类型 的值的时候,整个 算术表达式 的类型会自动进行提升
案例
//定义两个变量 int i = 10; char c ='A'; // 'A'的值是65 char ch= i + c; // 报错 char 类型会被自动提升为 int 类型 int j = i + c; System.out.println(i) ; // 75 int k = 10 + 13.14; // 报错 double d = l0 + 13.l4; // √
字符串的“+”操作
“abc"+ 123 // abc123
“abc"+ 12 + 3 // abc123 1 + 2 +"abc” // 3abc
+= 注意事项
( + - * / % ) = 的操作隐含了 强制类型转换
short s = 10; 1 s += 20; // 30 建议这样写 2 s = s + 20; // 类型不匹配:不能从 int 转换为 short 3 s = (short)(s + 20); // 强转 为 short 类型 System.out.println(s);
++ –
位置很关键
案例
1 int a = 10; int b = a++; // 先把 a 赋值给 b,然后 a 再 ++ System.out.println(a); // 11 System.out.println(b); // 10 2 int b = ++a; // 11
值一定为 布尔类型(boolean) true false
// ^ 相同为false,不同为true System.out.println(i > j ^ i > k ); // false ^ false = false System.out.println(i < j ^ i > k ); // true ^ false = true System.out.println(i > j ^ i < k ); // false ^ true = true System.out.println(i < j ^ i < k ); // true ^ true = false
! 可以放多个,就是取反取反再取反
逻辑与 & | 短路与 && |
---|---|
无论左边真假,右边都要执行 | 如果左边为真,右边执行 如果左边为假,右边不执行 |
逻辑或 l | 短路或 ll |
---|---|
无论左边真假,右边都要执行 | 如果左边为假,右边执行 如果左边为真,右边不执行 |
如何以最快的速度实现 num * 2^n
-用左移位
二进制:
0 000000
-1 111111
-2 111110
-3 111101
负数的二进制等于正数的二进制 取反 +1
格式 | 范例 |
---|---|
关系表达式 ? 表达式1 : 表达式2; | a > b ? a : b |
//获取两个数据中的较大值 int max = a > b ? a : b; // 别忘了在最前面 定义 数据类型(int)
三元运算符是 从右向左 的
面试题
在按下回车以后会被扫描到信息
导包:引入 Scanner 类
import java.uti1.Scanner ;
导包 的动作必须出现在 类定义 ( public class ) 的上面
定义(创建)对象
Scanner sc = new Scanner (System.in);
上面这个格式里面,sc 是 变量名
接收数据
sc.nextXxx(); Xxx 数据类型
//姓名 string name; System.out.println("请输入您的姓名:"); name = sc.next(); // 返回字符串的输入 //年龄 int age; System.out.println("请输入您的年龄:"); age = sc.nextInt(); //性别 System.out.println("请输入您的性别:"); String sex = sc.next(); // next方法没有 char 类型 //电话号码 System.out.println("请输入您的手机号:"); String phone = sc.next(;
补全 快捷键 Ctrl + Alt + V
sc.nextInt();
Scanner类 中的方法 next() 和 nextLine() 都是吸取输入台输入的字符
区别:
next() 不会吸取字符前/后的空格/Tab键,只吸取字符,开始吸取字符(字符前后不算)直到遇到空格/Tab键/回车截止吸取
nextLine() 吸取字符前后的空格/Tab键,回车键截止
详解
流程控制语句分类:
执行流程
在switch语句中,如果case控制的语句体后面不写break,将出现 穿透 现象,在不判断下一个case值的情况下,向下运行,直到遇到 break ,或者整体 switch 语句结束
switch (month) { case l: case 2: case 12: 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 ll: System.out.println("秋季"); break; default: System.out.println("你输入的月份有误"); }
语句 | 说明 |
---|---|
初始化语句 | 用于表示循环开启时的起始状态 即循环开始的时候什么样 |
条件判断语句 | 用于表示循环反复执行的条件 即判断循环是否能一直执行下去 |
循环体语句 | 用于表示循环反复执行的内容 即循环反复执行的事情 |
条件控制语句 | 用于表示循环执行中每次变化的内容 即控制循环是否能执行下去 ++ – |
表格的从上往下的顺序也是 循环 执行的顺序,初始化语句 只执行一次
多个初始化变量,实在不行可以放到上面啊
for (int start = 0,end = 5;...;...)
for 条件控制语句 所控制的 自增变量
因为归属 for 循环的语法结构中,在 for 循环结束后,就不能再次被访问到了
while 条件控制语句 所控制的 自增变量
对于 while 循环来说不归属其语法结构中,在while循环结束后,该变量还可以继续使用
for(int i = l; i<3; i++){ System.out.println ("abc") ; } System.out.println(i) ; // 报错
int a; int b; int c; int j = 0; for (int i = 100;i < 1000; i++) { a = i / 100; b = i / 10 % 10; c = i % 10; if (i == a * a * a + b * b * b + c * c * c) { j++; System.out.println(i); } } System.out.println(j); j = 0;
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第二十个月的兔子对数为多少?
珠穆朗玛峰:8844430毫米 ,纸:0.1毫米 ,折叠多少次
int a = 8844430; double b = 0.1; int i = 0; while (b < a) { b *= 2; i++; } System.out.println(i + "次"); // 27
因为先 执行 后 判断 ,所以无论如何都会 执行 一次
int k = 3; do { System.out.println("abc"); // 输出一次 abc k++; }while (k<3) ;
continue 和 break JavaScript 里的使用
Java 中的 exit
System.exit(0);
0 表示正常程序的关闭,非0表示异常关闭,也可放在循环体里面,和 break 差不多
使用步骤 与 Scanner 相同
导包
import java.util.Random;
导包 的动作必须出现在 类定义 ( public class ) 的上面
创建对象
Random r = new Random();
r 是 变量名,可以改变,其他的都不能改变
获取随机数
int a = r.nextInt(10); // 获取数据的范围:[0,10) 包括 0 不包括 10
a 是 变量名 和 取值范围 的 10 都可以 改变,其他的都不能改变
获取 1 - 100 之间的 随机数
方案: [0,100) → [1,101)
int a = r.nextInt(100) + 1;
是用于Java语言开发的 集成环境
集成环境:把代码 编写 、 编译 、 执行 、 调试 等多种功能综合到一起的 开发工具
傻瓜安装
30天试用无限刷新
傻瓜 汉化 和 英化
创建项目 的基本操作
编码格式:
快捷键
ctrl + + 放大
ctrl + - 缩小
可分为两大部分
第一部分
第二部分
视频教程
注意
写内容之前别忘了先 声明 main方法
声明 | 定义 |
---|---|
没有分配 内存 | 分配了 内存 |
声明 和 定义 的区别
与 .java 文件相对应的 .class 文件在另外的位置
模块 → 包 → 类 → 方法
效果 | 按键 |
---|---|
快速生成main()方法 | psvm + 回车 |
快速生成输出语句 | sout + 回车 |
效果 | 按键 |
---|---|
内容提示,代码补全等 | Alt + / |
效果 | 按键 |
---|---|
单行注释 | Ctrl + / |
多行注释 | Ctrl + Shift + / |
格式化代码 | Ctrl+Alt+L |
快捷键没反应
1. 新建模块
2. 删除模块
效果 | 操作 |
---|---|
在 程序 中 移除 | 在对应 模块 右键 点 Remove Module |
在 文件 中 完全 删除 | Show in Explorer 打开文件删除 ↓ |
3. 导入模块 重点
把别处的 模块 导入 项目 中
报错的话 安装SDK 就行
数组(array):一种用于存储 多个 相同类型 数据的 存储模型
目的:一次性 声明 大量的用于存储数据的 变量
例如:学号、成绩
第一种 | 第二种 | |
---|---|---|
格式 | 数据类型[] 变量名 | 数据类型 变量名[] |
范例 | int[ ] arr | int arr[ ] |
读法 | 定义了一个 int类型 的数组 数组名 是 arr | 定义了一个 int类型 的变量 变量名 是 arr数组 |
推荐使用第一种
Java 中的 数组 必须先 初始化 ,然后才能使用
初始化:为 数组 中的数组元素 分配内存空间 ,并为每个 数组元素 赋值
数组初始化方式:动态初始化、静态初始化
动态初始化 | 静态初始化 | |
---|---|---|
效果 | 初始化 时只指定 数组长度 由 系统 为数组分配 初始值 | 初始化 时指定每个数组元素的初始值 由 系统 决定 数组长度 |
格式 | 数据类型[] 变量名= new 数据类型[数组长度]; | 数据类型[] 变量名 = new 数据类型[]{数据1,数据2,…}; 简化格式:数据类型[] 变量名 = {数据1,数据2,…}; |
规范 | int[ ] arr = new int[3]; | int[ ] arr = new int[ ]{1,2,3}; int[ ]arr = { 1,2,3}; |
int[] arr = new int[3];
关键词 | 说明 |
---|---|
int | 说明数组中的元素类型是int类型 |
[ ] | 说明这是一个数组 |
arr | 数组的名称 |
关键词 | 说明 |
---|---|
new | 为数组申请内存空间 |
int | 说明数组中的元素类型是int类型 |
[ ] | 说明这是一个数组 |
3 | 数组长度,即数组中的元素个数 |
访问 | 格式 |
---|---|
数组变量访问 | 数组名 |
数组内部保存的数据的访问 | 数组名[索引] |
索引:数组 中数据的编号方式
作用:索引 用于访问 数组 中的数据使用,数组名[索引] 等同于 变量名 ,是一种特殊的 变量名
注意:在实际开发中,如果对应的索引不存在,一般都是返回一个负数,通常用 -1 来表示
空间名 | 作用 | 使用完毕 |
---|---|---|
栈内存 | 存储 局部变量 即定义在方法中的变量,例如: arr | 立即消失 |
堆内存 | 存储new出来的内容(实体、对象) 每一个new出来的东西都有一个地址值,例如:001 | 会在垃圾回收器空闲时被回收 |
视频
javaScript 中的内存分配
数组在 初始化 时,会为 存储空间 添加 默认值
数据类型 | 默认值 |
---|---|
整数 | 0 |
浮点数 | 0.0 |
布尔值 boolean | false |
字符 char | 空字符 |
引用数据类型 | null |
把第一个数组的 地址 赋值给第二个数组
int[] arr2 = arr; // 两数组 地址 将相同
输出 ↓
Debug调试,又被称为断点调试,是供程序员使用的 程序调试工具
断点 其实是一个标记,告诉我们从哪里开始查看
Debug的功能:
如何加断点
如何运行加了断点的程序
看哪里
点哪里
继续运行
注意: 如果数据来自于键盘输入,一定要记住输入数据,不然就不能继续往下查看了
结束
如何删除断点
有多个断点,可以一个个的点,也可以一次性全部删除
方法(method):是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的 代码集
方法可以提高代码的 复用性
方法必须先创建才可以使用,该过程称为 方法定义
格式:
public static void 方法名(){ //方法体 }
范例:
public static void method() { //方法体 }
我可能正是个傻逼才会在main方法里写别的方法吧
方法创建后并不是直接运行的,需要手动使用后才执行,该过程称为 方法调用
格式:
方法名();
范例:
method();
public static void main(String[] args) { method(); // 1 } public static void method() { int a = 1; if (a > 0) { System.out.println(a); } }
单个参数 | 多个参数 | |
---|---|---|
格式 | public static void 方法名(数据类型 变量名) {…} | public static void方法名(数据类型 变量名1,…) {…} |
规范 | public static void method(int number) {…} | public static void getMax(int a,int b,…) {…} |
单个参数 | 多个参数 | |
---|---|---|
格式 | 方法名(参数); | 方法名(变量名1/常量值1,变量名2/常量值2); |
规范 | method(3); | getMax (a,5,…) ; |
基本数据类型
public static void main(String[] args) { int a = 2; // 这里不用写 数据类型 method(a); // 2 } // 这里的 int b 和上面没有关系,写 int a 也一样 // 注意,这不是 JavaScript ,别忘了你的数据类型,int! public static void method(int a) { if (a > 0) { System.out.println(a); } }
数组
public static void main(String[]args) { // 定义一个数组,用静态初始化完成数组元素初始化 int[] arr = {1,2,3}; // 调用方法 printArray(arr); } // 定义一个方法,用数组遍历通用格式对数组进行遍历/* /* 两个明确: 返回值类型: void 参数: int[] arr */ public static void printArray(int[] arr) { for(int x = 0;x<arr.length;x++) { System.out.println(arr[x]); } }
格式:
public static 数据类型 方法名(参数){ return 数据; }
范例:
// boolean public static boolean method(int number){ return true; }
// int public static int getMax(int a,int b) { return 100; }
注意事项
public static void main(String[] args) { int a = 2; boolean b = method(a); System.out.println(b); } public static boolean method(int a) { if (a > 0) { return true; } else { return false; } }
格式:
public static 返回值类型 方法名(参数){ 方法体; return 数据; }
关键词 | 说明 |
---|---|
public static | 修饰符 |
返回值类型 | 方法操作完毕之后返回的数据的数据类型 如果方法操作完毕,没有数据返回,这里写void,而且方法体中一般不写 return |
方法名 | 调用方法时候使用的标识 |
参数 | 由数据类型和变量名组成,多个参数之间用逗号隔开 |
方法体 | 完成功能的代码块 |
return | 如果方法操作完毕,有数据返回,用于把数据返回给调用者 |
注意事项
定义方法 时,要做到两个明确
调用方法时
方法重载:同一个类中定义的多个方法之间的关系,满足
① 多个方法在 相同的类 中
② 多个方法具有 相同的方法名
③ 多个方法的 参数 不相同, 类型 不同或者 数量 不同,这三点有不相同的就行
的多个方法相互构成重载
参数 int a 相同 与返回值无关 | 参数个数不同 |
参数类型相同 | MethodDemo01 和 MethodDemo02 是两个类 |
案例:
在调用的时候,Java虚拟机 会通过 参数的不同 来区分 同名的方法
public static void main(String[] args) { //调用方法 int result = sum(1,2); System.out. println(result); // 3 double result2 = sum(1.0,2.0); System.out.println(result2); // 3.0 int result3 = sum(1,2,3); System.out.println(result3); // 6 } //需求1:求 两个 int类型数据 和的方法 public static int sum(int a,int b) { return a + b; } // 需求2:求 两个 double类型数据 和的方法 public static double sum(double a,double b) { return a + b; } // 需求3:求 三个 int类型数据 和的方法 public static int sum(int a,int b,int c) { return a + b + c; }
对于 基本数据类型 的参数, 形参 的改变,不影响 实参 的值
对于 引用类型 的参数,形参 的改变,影响 实参 的值
语法错误 显示 红色波浪线
有三种方式导包