JavaSE
一、命令行窗口的常用命令
常用命令 | 作用 |
---|---|
盘符: | 切换到某个盘下: D:,C: |
dir | 查看当前路径下的文件信息 |
cd | 进入单级目录: cd environment 进入多级目录: cd:\environment\JavaSE\day1 回退到上一级目录:cd… 回退到盘符根目录:cd\ |
cls | 清屏 |
二、JDK安装后Path和Java_home环境变量
-
Path
Path环境变量用于配置程序路径,方便在命令行窗口的任意目录启动程序
位置:此电脑-属性-高级系统设置-高级-环境变量-Path
-
Java_home
Java_home用于告诉操作系统JDK安装在了哪个位置(将来其他技术要通过这个环境变量找到JDK)
三、IDEA常用快捷键
快捷键 | 功能效果 |
---|---|
main/psvm、sout、… | 快速键入相关代码 |
Ctrl+D | 复制当前行数据到下一行 |
Ctrl+Y | 删除所在行,建议用Ctrl+X(剪切) |
Ctrl+Alt+L | 格式化代码 |
Alt+Shift+↑ Alt+Shift+↓ | 上下移动当前代码 |
Ctrl+/ Ctrl+Shift+/ | 对代码进行注释 |
四、Java基础
4.1 注释
-
单行注释
// 注释内容,只能写一行
-
多行注释
/* 注释内容1 注释内容2 */
-
文档注释
文档注释的内容可以提取到一个程序说明文档中
/** 注释内容 注释内容 */
快捷键进行注释 功能效果 Ctrl+/ 单行注释(对当前行进行注释) Ctrl+Shift+/ 对选中的代码进行多行注释
4.2 类型转换
-
自动类型转换
小范围类型的变量可以直接赋值给大范围类型的变量
-
表达式的自动类型转换
表达式的最终结果类型示由表达式中的最高类型决定
表达式中byte、short、char直接提升成int来运算
-
强制类型转换
大范围类型的变量赋值给小范围类型的变量会出现错误,需要强制类型转换
格式:数据类型 变量2 = (数据类型)变量1
4.3 运算符
-
*赋值运算符+= -= = /= %=
适合做数据的累加操作
自带强制类型转换:a += b 等价于 a =(a的类型)(a + b)
-
运算符优先级
&&(短路与)优先级高于 ||(短路或)
4.4 案例技术:键盘录入技术
-
API文档
应用程序编程接口,技术说明书,告诉我们该怎么使用Java的程序
-
Scanner
Step1-导包(自动导包):
import java.util.Scanner;
Step2-创建扫描器对象:
Scanner sc = new Scanner(System.in);
Step3-调用功能接收数据:
int age = sc.nextInt() ;
String name = sc.next();
4.5 案例技术:随机数Random类
-
Random
Step1-导包(自动导包)
import java.util.Random;
Step2-创建随机数对象
Random r = new Random();
Step3-调用功能接收随机数
int data = r.nextInt(100);
//注意:包前不包后(0 - 99)
-
生成指定区间的随机数
减加法
//13 - 45 ==> -13 ==> (0 - 32) + 13
int data = r.nextInt(33) + 13;
Java其实给了我们一些功能直接就能得到指定区间的随机数
int data = r.nextInt(13,46)
//包前不包后(13-45)
-
origin (inclusive) bound (exclusive)
五、数组
数组变量名中存储的是数组在内存中的地址,数组是引用数据类型
5.1 静态初始化数组
特点:定义数组的时候 直接给数组赋值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B77zL0xs-1655894133800)(./images/静态初始化数组.png)]
5.2 动态初始化数组
特点:定义数组的时候 只确定元素的类型和数组的长度,不存入具体的数据(先定义后赋值)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TdZWP5FS-1655894133801)(./images/动态初始化数组.png)]
5.3 数组的遍历
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ffQFqGJr-1655894133802)(./images/数组的遍历.png)]
5.4 数组的内存图
Java的内存分配
方法区:放置类信息class字节码文件
栈内存:方法执行的区域,变量存储的区域
堆内存:new出来的对象,数组对象
5.5 数组使用的常见问题
问题1:
如果访问的元素位置超过最大索引,执行时会出现ArrayIndexOutOfBoundsException
(数组索引越界异常)
问题2:
如果数组变量中没有存储数组的地址,而是null, 在访问数组信息时会出现NullPointerException
(空指针异常)
六、方法
封装一段代码的语法结构,可以被重复调用,以此提高代码复用性,提高开发效率,让程序逻辑更清晰
6.1 方法定义
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u6lCGtiY-1655894133802)(./images/方法的定义.png)]
方法与方法之间是平级关系,不能嵌套定义
6.2 方法调用的内存原理
方法没有被调用的时候,在方法区中的字节码文件中存放
方法被调用的时候,需要进入到栈内存中运行
6.3 方法的参数传递机制:值传递
基本类型的参数传递(传递数据值)
在传输实参给方法的形参的时候,并不是传输实参变量本身, 而是传输实参变量中存储的值,这就是值传递
形参:以方法为例,就是方法定义时“()”中所声明的变量
实参:在方法内部定义的变量
引用类型的参数传递(传递地址值)
以数组为例,栈内存中变量(数组首地址)的值没有变化,但是其指向的堆内存中的对象内容变化了
6.4 方法重载
方法重载的形式、作用
形式:同一个类中,多个方法的名称相同,形参列表不同,那么这些方法就是重载方法
作用:对于相似功能的业务场景,可读性好,方法名称相同提示是同一类型的功能,通过形参不同实现功能差异化的选择,这是一种专业的代码设计
方法重载的识别技巧
只要是同一个类中,方法名称相同、形参列表不同,那么他们就是重载的方法,其他都不管
(如:修饰符、返回值类型都无所谓)
形参列表不同指的是:形参的个数、类型、顺序不同,不关心形参的名称
6.5 补充知识:单独使用return关键字
return;
跳出并立即结束当前方法的执行
return关键字单独使用可以放在任何方法中
break;
跳出并结束当前所在循环的执行
continue;
结束当前所在循环的当次继续,进入下一次执行
七、面向对象编程(OOP)
类(设计图):是对象共同特征的描述
对象:是真实存在的具体实例
在Java代码中,必须先设计类,才能new(创建)对象并使用
7.1 类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ji0tRql8-1655894133803)(./images/定义类的格式.png)]
7.2 对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Y0sKkee-1655894133804)(./images/如何得到类的对象.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yGl50Dg6-1655894133805)(./images/如何使用对象.png)]
7.3 对象在内存中的运行机制
方法区-栈内存-堆内存
对象放在堆内存中
对象变量放在栈内存中,存储的是对象在堆内存中的地址
成员变量的数据放在对象中,存在于堆内存里
成员变量在堆内存里,局部变量在栈内存里
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DieS8XZs-1655894133806)(./images/面向对象内存机制.png)]
7.4 垃圾回收
当堆内存中的类对象或数组对象,没有被任何变量引用(指向)时,就会被判定为内存中的**“垃圾”**
Java存在自动垃圾回收器,会定期进行清理
7.5 构造器
定义在类中的,可以用于初始化一个类的对象,并返回对象的地址
![构造器的格式](./images/构造器的格式.png)
构造器的分类和作用
无参数构造器(默认存在的):初始化对象时,成员变量的数据均采用默认值
有参数构造器:在初始化对象的时候,同时可以接收参数为对象进行赋值
构造器的注意事项
任何类定义出来,默认就自带了无参数构造器,写不写都有
一旦定义了有参数构造器,那么无参数构造器就失效了,如果还想用无参数构造器,此时就需要自己手写一个无参数构造器
7.6 this关键字
出现在构造器和方法中,代表当前对象的地址
this关键字的作用
可以用于指定访问当前对象的成员变量、成员方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JtRnj98I-1655894133806)(./images/this在参数构造器中.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i9GaiQAb-1655894133807)(./images/this在成员方法中.png)]
7.7 封装
面向对象的三大特征:封装,继承,多态
封装:告诉我们,如何正确设计对象的属性和方法
封装的原则:对象代表什么,就得封装对应的数据,并提供数据对应的行为
如何更好地封装
一般建议对成员变量使用private(私有、隐藏)关键字修饰(private修饰的成员只能在当前类中访问)
为每个成员变量提供配套public修饰的getter、setter方法暴露其取值和赋值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AUdU3dr6-1655894133808)(./images/更好地封装.png)]
7.8 标准JavaBean
也可以称为实体类,其对象可以用于在程序中封装数据
标准JavaBean须满足如下书写要求:
成员变量使用 private 修饰
提供成员变量对应的 setXxx() / getXxx()方法
必须提供一个无参构造器;有参数构造器是可写可不写的
7.9 补充知识:成员变量、局部变量区别
区别 | 成员变量 | 局部变量 |
---|---|---|
类中位置不同 | 类中,方法外 | 常见于方法中 |
初始化值不同 | 有默认值,无需初始化 | 没有默认值,使用之前需要完成赋值 |
内存位置不同 | 堆内存 | 栈内存 |
生命周期不同 | 随着对象的创建而存在,随着对象的消失而消失 | 随着方法的调用而存在,随着方法的运行结束而消失 |
作用域 | 在所归属的大括号中 |
八、常用API(String、ArrayList)
API (Application Programming Interface,应用程序编程接口)
Java写好的程序(功能),可以直接调用
Oracle 也为Java提供的这些功能代码提供了相应的 API文档(使用说明书)
8.1 String
String类定义的变量可以用于存储字符串,同时String类提供了很多操作字符串的功能,我们可以直接使用
java.lang.String 类代表字符串,String类定义的变量可以用于指向字符串对象,然后操作该字符串
Java 程序中的所有字符串文字(例如“abc”)都为此类的对象
8.1.1 String类的特点详解
String其实常被称为不可变字符串类型,它的对象在创建后不能被更改
String变量每次的修改其实都是产生并指向了新的字符串对象,原来的字符串对象都是没有改变的,所以称不可变字符串
字符串对象存在哪里
以“ ”方式给出的字符串对象,在字符串常量池中存储
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pNFCTJKd-1655894133808)(./images/字符串对象存储.png)]
8.1.2 String类创建字符串对象的方式
方式一:直接使用“ ”定义(推荐方式)
String name = "黑马";
方式二:通过String类的构造器创建对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dbz2XdwP-1655894133809)(./images/通过String类的构造器创建对象.png)]
8.1.3 两种创建方式的区别(面试常考)
以“ ”方式给出的字符串对象,存储于堆内存中的字符串常量池,而且相同内容只会在其中存储一份
通过构造器new对象,每new一次都会产生一个新对象,放在堆内存中分开存储
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IvCiRYGK-1655894133810)(./images/通过“”定义字符串内存原理.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w77yQikC-1655894133811)(./images/通过new构造器得到字符串对象.png)]
8.1.4 String类常见面试题
8.1.5 String类常用API
字符串内容比较
字符串的内容比较不适合用“==”比较,因为指向的地址不同
推荐使用String类提供的“equals”比较:只关心内容一样即可
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bLoF5MHA-1655894133812)(./images/equals.png)]
遍历、截取、替换、分割操作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BkPnNCD6-1655894133813)(./images/遍历、替换、截取、分割操作.png)]
8.2 ArrayList
ArrayList代表的是集合类,集合是一种容器,与数组类似,不同的是集合的大小是不固定的
通过创建ArrayList的对象表示得到一个集合容器,同时ArrayList提供了比数组更好用,更丰富的API (功能)
8.2.1 ArrayList集合的对象获取
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gg5UmmEJ-1655894133814)(./images/ArrayList集合的对象的创建.png)]
8.2.2 ArrayList集合的添加元素的方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DKXayKOa-1655894133814)(./images/ArrayList集合的添加元素的方法.png)]
8.2.3 ArrayList集合对于泛型的支持
使用泛型以统一ArrayList集合操作的元素类型,创建集合对象都应该使用泛型
ArrayList:其实就是一个泛型类,可以在编译阶段约束集合对象只能操作某种数据类型
注意:泛型只能支持引用数据类型,不支持基本数据类型
ArrayList<String> list = new ArrayList<>();
//此集合只能操作字符串类型的元素
ArrayList<Integer> list = new ArrayList<>();
//此集合只能操作整数类型的元素
ArrayList<Object> list = new ArrayList<>();
//此集合可以操作所有类型的元素
ArrayList<Student> list = new ArrayList<>();
ArrayList<Movie> list = new ArrayList<>();
//此集合可以操作自定义类型的元素
8.2.4 ArrayList集合常用API
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GzhXZRjk-1655894133815)(./images/ArrayList集合常用方法.png)]
8.2.5 ArrayList集合遍历并删除元素
从前往后边遍历边删除存在问题:可能会存在漏掉元素
删除元素后,马上后退一步i–就可以了
从后往前遍历,边遍历变删除没毛病
8.2.6 ArrayList集合存储自定义类型的对象
ArrayList<Student> list = new ArrayList<>();
ArrayList<Movie> list = new ArrayList<>();
注意:集合容器中存储的是每个对象在堆内存中的地址