导航🌌
目录
目录
进入面向对象编程的学习阶段,编译器也应该使用更高级的了,这里引入Java的IDE(集成开发环境)- IDEA。IDEA全称是IntelliJ IDEA,是Java程序员公认的最好的Java开发工具。IDEA是JetBrains公司的产品,总部位于捷克的首都布拉格。IDEA除了支持Java开发,还支持HTML,CSS,PHP,MySQL,Python等
IDEA官网:JetBrains:软件开发人员和团队的必备工具
至于IDEA的下载和安装,以及破解,百度和B站是个神奇的工具,可自行解决,这里不过多赘述。
| 功能 | 快捷键 |
|---|---|
| 添加注释和取消注释 | Ctrl + / |
| 快速格式化代码 | Ctal + Alt + L |
| 删除当前行 | Ctrl + Y |
| 复制当前行到下一行 | Ctrl + D |
| 快速运行程序 | Shift + F10 |
| 打开运行选择,可以选择运行指定类 | Alt + Shift + F10 |
| 补全代码 | Alt + / |
| 导入该行需要的类(需要先配置auto import) | Alt + Enter |
| 快速生成构造器等 | Alt + Insert |
| 查看一个类的层级关系(在继承的学习中很好用) | Ctrl + B |
| 自动分配变量名 | .var(在后面加上.var) |
在编写代码的过程中,有一些代码是经常使用的,比如输出语句,for循环等,为了提高程序员的效率,IDEA引入了模板功能,通过输入特定的简写快速补全相应代码。
模板功能路径:File -> Settings -> Editor -> Live Templates,这里提供了很多模板,选到Java可以查看IDEA提供的Java模板,可以查看也可以自己添加模板.
| 模板简写 | 对应模板 |
|---|---|
| fori | for(int $INDEX$ = 0; $INDEX$ < $LIMIT$; $INDEX$++) {
$END$
} |
| main | public static void main(String[] args){
$END$
} |
| sout | System.out.println($END$); |
| St | String |
在开发中,程序员在查找错误时,可以使用断点调试,一步一步查看源码执行过程,从而发现错误所在,这也是成为一个优秀的程序员的必备技能。
在断点调试过程中,是运行状态,是以对象的运行类型来执行的
断点调试介绍:断点调试是指在程序的某一行设置一个断点,调试时,程序运行到这一行就会停住,然后你可以一步一步往下调试,调试过程中可以查看各个变量的值,出错的话,调试到出错的代码时即显示错误,这时就可以停下进行分析从而解决这个Bug
| 快捷键 | 功能 |
|---|---|
| F7 | 跳入方法内 |
| Alt + Shift + F7 | 强制进入方法内 |
| F8 | 逐行执行代码 |
| Shift + F8 | 跳出方法 |
| F9 | resume,执行到下一个断点 |
IDEA调试过程如何进入查看JDK源码,有以下两种解决方法:
为了区分相同名字的类,Java引入了包的概念,包本质就是通过创建不同的文件夹/目录来保存类文件。当类很多时,使用目录可以进行很好的管理,同时,包也可以控制访问范围。
基本语法:
- package project.code.hello;
- //1. package关键字,表示打包
- //2. project.code.hello表示包名,
- // . 表示递归创建,在project文件下继续创建code文件,在code文件继续创建hello
包的命名规则:
只能包含数字、字母、下划线、小圆点,不能使用数字开头,也不能是关键字或保留字
包的命名规范:
一般是小写字母+小圆点,一般是com.公司名.项目名.业务模块名
常用的包:
引入包的基本语法:
import 包;
引入包的主要目的是要使用该包下的类,比如 import java.util.Scanner; 就只是引入一个类Scanner。而 import java.util.*; 表示将java.util包下所有的内容都引入。这里建议,我们需要使用到哪个类,就导入哪个类即可,不建议使用 * 导入
在IDEA中,可以通过 File -> Settings -> Editor -> General -> Auto Import,勾选Add unambiguous import on the fly 实现自动导入所使用类的包
注意事项:
Java提供四种访问修饰符号,用于控制方法和属性(成员变量)的访问权限(范围);
| 访问级别 | 访问控制修饰符 | 同类 | 同包 | 子类 | 不同包 |
|---|---|---|---|---|---|
| 公开 | public | √ | √ | √ | √ |
| 受保护 | protected | √ | √ | √ | × |
| 默认 | 没有修饰符 | √ | √ | × | × |
| 私有 | private | √ | × | × | × |
注意事项:
修饰符可以用来修饰类、类中的属性及成员方法
只有默认和public才能修饰类!并且遵循上面表格中访问权限的特点
成员方法的访问规则和属性完全一样
Java面向对象编程有三大特征:封装、继承、多态,下面逐一介绍:
封装(Encapsulation)就是把抽象出的数据(属性)和对数据的操作(方法)封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作(方法),才能对数据进行操作。
封装的理解和好处:就是把方法(排序细节、链接数据库等复杂操作)的实现细节给隐藏起来,用户不需要直到里面的细节,只通过传递参数即可得到想要的结果,同时可以对数据进行验证,保证安全合理。
封装的实现步骤:
- public void setXxx(参数列表) {
- //Xxx表示某个属性
- //加入数据验证的判断逻辑
- 属性 = 参数名;
- }
- public 数据类型 getXxx(参数列表) {
- //Xxx表示某个属性
- //这里也可以加入权限判断
- return Xxx;
- }
IDEA快速编辑set、get方法的快捷键,和构造器一样。在类定义块中,使用快捷键Alt + Insert 快速打开Generate窗口,然后点击Setter和Getter即可快速得到该类的set、get方法。
继承可以解决代码复用性,让编程更加靠近人类思维。当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过extends来声明继承父类即可。

继承的基本语法:
- class 子类 extends 父类{
- //特有属性
- //特有方法
- }
继承的好处:
注意事项:
继承的本质分析:
在子类中创建好对象后,访问属性和方法时,按以下查找关系来返回信息:

super代表父类的引用,用于访问父类的属性、方法、构造器,但不限于直接父类,可以追溯到顶级父类
基本语法:
关于直接使用/属性方法名、this.属性/this.方法名、super.属性/super.方法名的使用细节如下。
属性/方法名、this.属性/this.方法名:
super.属性/super.方法名:
使用super的查找顺序是直接从当前子类的直接父类查找,一直往上追溯至顶级父类,其他规则和上述this查找规则一样
super的好处:
| 区别点 | this | super |
|---|---|---|
| 访问属性 | 访问本类中的属性,如果本类没有此属性则从父类中继续查找 | 从父类开始查找属性 |
| 调用方法 | 访问本类中的方法,如果本类没有此方法,则从父类继续查找 | 从父类开始查找方法 |
| 调用构造器 | 调用本类构造器,必须放在构造器的首行 | 调用父类构造器,必须放在子类构造器的首行 |
| 特殊 | 表示当前对象 | 子类中访问父类对象 |
简单来说,方法重写(覆盖)就是子类的一个方法,和父类的某个方法的名称、返回类型(可以是兼容)、参数列表都一样,当方法实现细节可能有所变化,即子类的这个方法重写了(覆盖了)父类的方法。
方法重写的满足条件:
| 名称 | 发生范围 | 方法名 | 形参列表 | 返回类型 | 修饰符 |
|---|---|---|---|---|---|
| 方法重载(Overlord) | 本类 | 必须一样 | 类型、个数、顺序至少有一个不同 | 无要求 | 无要求 |
| 方法重写(Override) | 父子类 | 必须一样 | 必须相同 | 子类重写的方法返回类型和父类方法返回类型一致,或者是父类方法返回类型的子类 | 子类方法不能缩小父类方法的访问范围 |
方法或对象具有多种形态,是面向对象的第三大特征,多态是建立在封装和继承基础上的。
多态的具体体现:
关于对象的几个要点:
多态的前提是:两个对象(类)存在继承关系
多态的向上转型:
多态的向下转型:
关于编译类型和运行类型:
Java的动态绑定机制:
多态数组:
数组的定义类型(编译类型)为父类类型,里面保存的实际元素为子类类型(运行类型根据实际情况由JVM判断),运用了向上转型
instanceof:
可以使用instanceof来判断对象和类的关系,判断的是对象的运行类型是否为该类或该类的子类,表达式结果是一个boolean类型的值,常和向下转型配合使用
使用表达式:对象名 instanceof 类名
多态参数:
方法定义的参数类型为父类类型,在传递实参时允许实参为子类类型
下面介绍Object类中的几个常用的方法
== 和 equals 的对比:
声明:public native int hashCode();
返回该对象的哈希码值,支持此方法是为了提高哈希表的性能。实际上,由Object类定义的hashCode方法确实会针对不同的对象返回不同的整数,但这一般提高将该对象的内部地址转换成一个整数来实现的,Java编程语言不需要这种实现技巧
注意事项:
默认返回:全类名+@+哈希值的十六进制
注意事项:
这里简单提一下这个方法,当对象被回收时,系统会自动调用该对象的finalize方法,子类可以重写该方法,做一些释放资源的操作
注意事项:
学习记录:
- 📆本篇博客整理于2022.8.4~2022.8.9,关于Java的学习先到此告一段落,后面将继续学习Linux以及C++
- 🎓作者:如何写出最优雅的代码
- 📑如有错误,敬请指正🌹🌹
- 🥂关注一波不迷路!如果觉得写的不错,看完了别忘了点赞和收藏啊,感谢支持😏😏