java基础知识点整理一
引言
'''
突然发觉任何一门语言的基础知识部分,都比较杂一些.
如果个人经过梳理之后,知识体系系统化,可以让基础更加牢靠一些。
但是还是会有一些遗忘。
所以,我想把一些比较重要但是容易遗忘的知识,写成笔记,
到时候直接Ctrl+F 查找
time:2020年12月29日18:40:45 V1
#2021年1月2日13:34:43 V2
'''
# ★ 的数量代表重要程序
java的跨平台原理
平台:指的是操作系统。
例如主流平台:Windows、Mac OS、Linux等
跨平台:Java程序可以在任意操作系统上运行。 java源程序主要靠JVM来运行,这使得Java可以独立于平台,有着更好的可扩展性与跨平台性。
JDK、JRE、JVM ★★★
详细:JKD与JRE与JVM
示意图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dD9lDxX0-1616728708313)(http://img.ensio.cn/img/jdkjvmjre.jpg “图一”)]
- JVM: (java virtual machine),java虚拟机 用来解释执行字节码文件(class文件)的。
- JRE: (java runtime environment), java运行时环境,针对java用户
- JDK: (java development kit), java开发工具包,用来开发Java程序的,针对java开发者。
-
JVM
JVM:Java Virtual Machine(Java 虚拟机)JVM是JRE的一部分,它是一个虚拟出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。
JVM是Java实现跨平台最核心的部分,所有的Java程序会首先被编译为.class的类文件,
JVM的主要工作是解释自己的指令集(即字节码)并映射到本地的CPU的指令集或OS的系统调用。
Java面对不同操作系统使用不同的虚拟机,依次实现了跨平台。
JVM对上层的Java源文件是不关心的,它关心的只是由源文件生成的类文件。 -
JRE
JRE:Java Runtime Environment(Java运行环境)。在Java平台下,所有的Java程序都需要在JRE下才能运行。只有JVM还不能进行class的执行,因为解释class的时候,JVM需要调用解释所需要的类库lib。JRE里面有两个文件夹bin和lib,这里可以认为bin就是JVM,lib就是JVM所需要的类库,而JVM和lib合起来就称为JRE。
JRE包括JVM和JAVA核心类库与支持文件。
与JDK不同,它不包含开发工具—-编译器、调试器和其它工具。 -
JDK
JDK:Java Development ToolKit(Java开发工具包)。JDK是整个JAVA的核心,包括了Java的运行环境(Java Runtime Environment)、一堆Java工具(javac、java、jdb等)和Java基础的类库(即Java API包括rt.jar)。
Java API是Java的应用程序接口,里面有很多已经写好的Java Class,包括一些重要的语言结构以及基本图形,网络和文件I/O等等,我们可以直接调用使用。
总结:有JVM就可以解释执行字节码文件(.class).JVM解释执行这些字节码文件的时候需要调用类库,如果没有这些类库JVM就不能正确的执行字节码文件,JVM+类库=JRE,有了JRE就可以正确的执行java程序了,但是光有JRE不能开放Java程序,所以JRE+开发工具=JDK,有了JDK,就可同时开发,执行JRE.`
常用DOS命令 ★★★
通配符
*代表一个字符串
?代表一个字符
用法:通配符一般用于文件名的关键字查找。
例如我们要查找以字母y开头的所有文件,可以输入以下命令:dir y*.*;
如果要查找所有扩展名为exe的文件,可以用dir .exe。?只代表一个字符
例如我要查找第二个字母为s的所有文件,可以输入:DIR ?s*.*。
参数意义
/p 显示信息满一屏时。按任意键显示下一屏
/o 排序显示。
/s 将目录与子目录的全部文件名/目录都显示。
/w 只显示文件名或者目录名,每行五个。
/a 显示隐藏文件
命令
- dir 显示目录文件与子目录信息
- md 创建一个目录,格式 md[C:]path
- cd 改变或者显示当前目录,格式 cd[C:][ptah]
- cd …/ 或者 cd … 返回上一层目录
- cd / 返回根目录
- rd 删除空子目录
- copy 复制
- ren 重新命名,格式ren[C:][path] filename1 filename2
- cls 清屏
- exit 退出
- ipconfig 查看ip信息
注释
- 单行注释: //
- 多行注释: /* 注释内容 */
- 文档注释: /** 文档树枝 */
关键字(保留字)
可以理解成被占用的名字
- 特点
- 关键字全部为小写
- 编辑器显示为语法高亮
- main不是关键字
- 可以理解为一种约定,是检测程序的一个入口。
基础数据类型 ★
数据类型 | 关键字 | 字节大小 | 取值范围 |
---|---|---|---|
整数 | byte | 1 | -128~127 |
. | short | 2 | -32768~32767 |
. | int | 4 | 日常范围约-231~231 |
. | long | 8 | 足够大 |
浮点数 | float | 4 | 日常小数范围 |
. | double | 8 | 小数不够表示就用这个 |
字符 | char | 2 | 0~65535(ascii) |
布尔 | Boolean | 1 | true、false |
变量使用的规范 ★
- 先定义后调用
- 一条语句可以定义多个变量,逗号分隔
- 在定义float与long类型时候,后缀加F/f与L/l,前者无所谓,但是long建议大写,小写的l容易与1混淆。
- 请注意变量的作用域,也就是作用范围,注意区别全局与局部变量
- 变量命名要见名知义,注意命名规范
scanner包输入
- 三步骤
-
导包
- import java.util.Scanner;
-
创建对象
- Scanner name = new Scanner(System.in);
- 实例化接受输入数据
- int i = name.next()
在接收用户输入时,遇到空格结束。
例如:qwe er er
接收后,实际接收的是 qwe
- int i = name.nextLine()
在接收用户输入时,遇到换行结束。
例如:qwe er er
接收后,实际接收的是 qwe er er
- int i = name.next()
-
- 常用方法
- 如图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z1rea6jk-1616728708325)(http://img.ensio.cn/usr/uploads/2020/12/106960889.jpg “图一”)]
- 如图
标识符/命名规范 ★★
- 小驼峰命名法
适用于变量等
除第一个单词首字母小写,其他单词首字母大写
例如:isName 、stuName 、classPath
- 大驼峰命名法
适用于类、函数、属性等
每一个单词首字母都大写
例如:StuName 、StuScouse、StuScTotal
类型转换 ★★
隐性类型转换
在进行隐性类型转换或者赋值时,要注意类型的字节,不能讲字节过大的类型转换或者赋值给字节小于前者的类型。
! byte、short、char 在参与运算时,会先转换为int,再参与运算,运算结果的类型为int。
package one;
public class one {
public static void main(String[] args) {
byte a = 2;
byte b = 2;
// byte c = a + b;
// 会出现错误,(a+b)运算规则为(int)a + (int)b = (Byte) 4
// 正确的写法为:
byte c = byte(a + b);
}
}
例子
package one;
public class one {
public static void main(String[] args) {
int a = 10;
byte b = a;
}
}
// 出现下面错误
> Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Type mismatch: cannot convert from int to byte
> 出错原因是因为:int字节为4,而byte的字节为1,所以不能将字节过大的int 赋值给byte
强制转换 ★
可以将数据表示范围大的类型 转换为 范围小的类型
一般情况下,基本可以随便用,但有时候也要考虑到 经过强制类型转换后,可能会损失精度。
package one;
public class one {
public static void main(String[] args) {
int a = 10;
float b = 1.5f;
double c = (double)a;
int d = 10;
byte e = (byte)a;
System.out.println(a+"\n"+b+"\n"+c+"\n"+d+"\n"+e);
}
}
//
> 10
1.5
10.0
10
10
运算符
要注意[扩展赋值运算符],自带强转!!!
- 算数运算符
正常运算,要注意不同类型参加运算时,类型的精度变化过程
- 自增自减
单独运算时,规则不变,但是在参与其他运算时,要注意优先级。
在一条语句中,要注意a–、a++参与运算后再自增自减。
package one;
public class one {
public static void main(String[] args) {
System.out.println(10/3);
// 3
System.out.println(10/2);
// 5
System.out.println(10/3.0);
// 3.333333
}
}
- 赋值运算符
要注意到 = 与 == 之间区别
- 关系运算符(比较运算符)
+= -= *= /= ==
- 逻辑运算符(比较运算符)
注意到短路原则:&& 前置值为false时,结果直接为false,后面的表达式不参与逻辑运算。
|| 同理,前置值为true时,后面表达式不参与运算,直接得出结果。。
- 三元运算符
注意到三元运算符的复合使用。
字符与字符串的一些问题 ★
- 注意字符在参与运算时,优先级问题。
- 注意字符串强大的包容性。
语句在三大结构的作用域
当结构体内只有一条语句(单语句)时,可以省略大括号,可以加上,但是可以一定情况下使代码更加明了。
当结构体内,语句多余一条时,要注意结构体的作用域。
控制语句
选择语句
当条件语句的语句内容只有一条语句时,可以不加{},当多余一条时,必须加{}。
判断条件要加()。
可以与循环或者自身嵌套使用。
条件判断的结果一定为true或者false
- if
- 干对的事,没有就什么都不做
- if…else
- 分析判断语句值性,对的,我要干什么,错的,我应该怎么做
- if…else if…else
- 要么…要么…那么…
- 可以相互多层嵌套
循环语句
解决大量重复性的操作,减少开发工作量,提高编码效率,大部分可以转化为递归实现。
- for
- 主要规避一些小错误
- 初值,循环条件,结束条件,增值,作用域等等
- while
- 相比for,在一定情况下更加灵活,例如可以在条件判断时,增加结束条件
- do…while
- while的补充,比while多执行一次,无论条件是否成立。会先执行do循环体内容,再判断。适用于一些特殊情况,例如调试。
IDEA 快捷键
一些常用快捷键记录
快捷键 | 说明 |
---|---|
main/psvm + 回车 | 快速生成main方法 |
sout + 回车 | 快速生成输出语句 |
Alt + 1/4 | 打开/隐藏工程目录/控制台 |
Ctrl + Alt + L | 格式化代码 |
Alt + Enter | 代码修正提示 |
Ctrl + D | 向下复制一行 |
Ctrl + X | 剪贴当前行 |
Ctrl + / | 批量单行注释 |
Ctrl + Shift | 批量多行注释 |
Alt + Shift + ↑/↓ | 上/下移当前行 |
数组
数组定义
要注意数组同属问题,相同类型放一个同类型数组中,这也就是数组类型定义的必要性。
- int arr[];
- int[] arr;
数组初始化
静态初始化
初始化时,就指定数组存储元素,系统自动计算数组长度
- 简易写法
- 简化的知识书写格式
- int[] arr = {11,22,33};
- 复杂写法
- int[] arr = new int[]{11,22,33};
动态初始化
初始化时,先指定数组长度,系统自动初始化默认元素(例如整数0小数0.0),数组元素后期存入。
-
两种写法
int[] arr = new int[3]; int arr[] = new int[3];
二维数组
存储多个一维数组,多用于列表,表格
动态/静态初始化
跟一维数组差不多
要注意二维数字定义
例如:int[] arr[] = new int[][]; 也是对的
方法(函数)
方法重载
同一个类中,方法名相同,参数不同
参数不同;个数不同;类型不同;顺序不同
注意:识别方法之间是否构成重载关系,只看方法和参数,与返回值无关
其他重点
;
java中进制表示
- 二进制 0b
- 八进制 0
- 十六进制 0x
大小写都可以