最后
对于很多Java工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。
整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
再分享一波我的Java面试真题+视频学习详解+技能进阶书籍
对各种变量、方法和类等要素命名时使用的字符序列
定义规则:
-
由26个英文字母,0-9,_或$组成
-
数字不能开头
-
不可以使用关键字和保留字
-
严格区分大小写
-
不能包含空格
Java命名规范:
-
包名:应全部小写
-
类名接口名:所有单词首字母大写
-
变量名、方法名:从第二个单词开始,单词首字符大写
-
常量名:所有字符都大写,多个单词用_连接
概念:
-
内存中的一个存储区域
-
该区域的数据可以在同一类范围内不断变化
-
变量是程序中最基本的数据存储单元。包含变量类型、变量名和存储的值
作用:
- 用于在内存中保存的数据
变量注意:
-
变量需要先声明,后使用
-
使用变量名来访问这块区域的数据
-
变量只有在作用域才有效
-
同一个作用域内,不能定义重名的变量
变量的分类-按数据类型
- 基本数据类型
byte、short、int、long、float、double、char、boolean
- 引用数据类型
class、interface、数组
按声明的位置
- 成员变量
实例变量、类变量
- 局部变量
形参、方法局部变量、代码块局部变量
基本数据类型的占用存储空间和范围
| 类型 | 占用存储空间 | 表示范围 |
| — | — | — |
| byte | 1字节 | -128~127 |
| short | 2字节 | -215~215-1 |
| int | 4字节 | -231~231-1 |
| long | 8字节 | -263~263-1 |
| float | 4字节 | -3.403E38~3.403E38 |
| double | 8字节 | -1.798E308~1.798E308 |
char中的转义字符
char 型数据用来表示通常意义上的字符(2字节)
Java中的所有字符都使用Unicode编码,故一个字符可以存储一个字母,一个汉字,或其他书面语的一个字符。
| 转义字符 | 说明 |
| — | — |
| \b | 退格符 |
| \n | 换行符 |
| \r | 回车符 |
| \t | 制表符 |
| " | 双引号 |
| ’ | 单引号 |
| \ | 反斜线 |
boolean
boolean 类型用来判断逻辑条件,一般用于程序流程控制:
-
if条件控制语句;
-
while循环控制语句;
-
do-while循环控制语句;
-
for循环控制语句;
boolean类型数据只允许取值true和false,无null。
基本数据类型转换
自动类型转换:容量小的类型自动转换为容量大的数据类型。数据类型按容量大小排序为:
char/byte/short—>int —>long—>float—>double
-
有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算。
-
byte,short,char之间不会相互转换,他们三者在计算时首先转换为int类型。 boolean类型不能与其它数据类型运算。
-
当把任何基本数据类型的值和字符串(String)进行连接运算时(+),基本数据类型的值将自动转化为字符串(String)类型。
String
-
String不是基本数据类型,属于引用数据类型
-
使用方式与基本数据类型一致。例如:String str = “abcd”;
-
一个字符串可以串接另一个字符串,也可以直接串接其他类型的数据。例如:
str = str + “xyz” ;
int n = 100;
str = str + n;
强制类型转换
-
自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符:(),但可能造成精度降低或溢出,格外要注意。
-
通常,字符串不能直接转换为基本类型,但通过基本类型对应的包装类则可以实现把字符串转换成基本类型。
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等
算数运算符
| 运算符 | 运算 | 示例 | 结果 |
| — | — | — | — |
| + | 正号 | +3 | 3 |
| - | 负号 | b=4,-b | -3 |
| + | 加 | 5+5 | 10 |
| - | 减 | 6-4 | 2 |
| * | 乘 | 3*4 | 12 |
| / | 除 | 5/5 | 1 |
| % | 取余 | 7%5 | 2 |
| ++ | 自增 | a=2,a = a++ | 2 |
| – | 自减 | a=2,a=a– | 1 |
| + | 字符串连接 | “H”+“i” | “Hi” |
赋值运算符
当“=”两侧数据类型不一致时,可以使用自动类型转换或使用强制类型转换原则进行处理。
= 、 += 、 -=、*=、/=、%=
比较运算符
| 运算符 | 运算 | 范例 | 结果 |
| :-: | :-: | :-: | :-: |
| == | 相等于 | 4==3 | false |
| != | 不等于 | 4!=3 | true |
| < | 小于 | 4<3 | false |
| > | 大于 | 4>3 | true |
| <= | 小于等于 | 4<=3 | false |
| >= | 大于等于 | 4>=3 | true |
| instanceof | 检查是否是类的对象 | “Hello” instanceof String | true |
运算逻辑符
| a | b | a&b | a&&b | a|b | a||b | !a | a^b |
| :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: |
| T | T | T | T | T | T | F | F |
| T | F | F | F | T | T | F | T |
| F | T | F | F | T | T | T | T |
| F | F | F | F | F | F | T | F |
“&”和“&&”的区别:
-
单&时,左边无论真假,右边都进行运算;
-
双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。
“|”和“||”的区别同理,||表示:当左边为真,右边不参与运算。
位运算符:
| 运算符 | 运算 | 示例 |
| :-: | :-: | :-: |
| << | 左移 | 3 << 2 = 12 --> 3_2_2=12 |
| >> | 右移 | 3 >> 1 = 1 --> 3/2=1 |
| >>> | 无符号右移 | 3 >>> 1 = 1 --> 3/2=1 |
| & | 与运算 | 6 & 3 = 2 |
| | | 或运算 | 6 | 3 = 7 |
| ^ | 异或运算 | 6 ^ 3 = 5 |
| ~ | 取反运算 | ~6 = -7 |
三元运算符:
(条件表达式)?表达式1:表达式2;
流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块。
其流程控制方式采用结构化程序设计中规定的三种基本流程结构,即:
-
顺序结构
-
分支结构
-
循环结构
顺序结构
程序从上到下逐行地执行,中间没有任何判断和跳转。
分支结构
-
根据条件,选择性地执行某段代码。
-
有if…else和switch-case两种分支语句。
if-else
if(条件){
语句;
}else if (条件){
语句;
}else {
语句;
}
-
条件表达式必须是布尔表达式(关系表达式或逻辑表达式)、布尔变量
-
语句块只有一条执行语句时,一对{}可以省略,但建议保留
-
if-else语句结构,根据需要可以嵌套使用
-
当if-else结构是“多选一”时,最后的else是可选的,根据需要可以省略
-
当多个条件是“互斥”关系时,条件判断语句及执行语句间顺序无所谓当多个条件是“包含”关系时,“小上大下 / 子上父下
SWITCH -CASE
switch (表达式){
case 常量1 :
语句;
break;
case 常量2 :
语句;
beeak;
default:
语句;
break;
}
-
switch(表达式)中表达式的值必须是下述几种类型之一:byte,short,char,int,枚举 (jdk 5.0),String (jdk 7.0);
-
case子句中的值必须是常量,不能是变量名或不确定的表达式值;
同一个switch语句,所有case子句中的常量值互不相同;
-
break语句用来在执行完一个case分支后使程序跳出switch语句块;如果没有break,程序会顺序执行到switch结尾
-
default子句是可任选的。同时,位置也是灵活的。当没有匹配的case时,执行default
循环结构
-
根据循环条件,重复性的执行某段代码。
-
有while、do…while、for三种循环语句。
-
注:JDK1.5提供了foreach循环,方便的遍历集合、数组元素。
循环语句的四个组成部分:
-
初始化部分(init_statement)
-
循环条件部分(test_exp)
-
循环体部分(body_statement)
-
迭代部分(alter_statement)
FOR
for(初始化部分;循环条件部分;迭代部分){
循环部分;
}
-
循环条件部分为boolean类型表达式,当值为false时,退出循环
-
初始化部分可以声明多个变量,但必须是同一个类型,用逗号分隔
-
可以有多个变量更新,用逗号分隔
while
while (循环条件){
循环体;
}
-
注意不要忘记声明迭代部分。否则,循环将不能结束,变成死循环。在循环体中该改变循环条件
-
f or循环和while循环可以相互转换
do-while
do {
循环体;
}while (条件);
do-while循环至少执行一次循环体。
break
-
break语句用于终止某个语句块的执行
-
break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块
continue
-
continue只能使用在循环结构中
-
continue语句用于跳过其所在循环语句块的一次执行,继续下一次循环
-
continue语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环
=================================================================
数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。
常见概念:
-
数组名
-
下标(或索引)
-
元素
-
数组的长度
-
数组本身是引用数据类型,而数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。
-
创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是这块连续空间的首地址。
-
数组的长度一旦确定,就不能修改。
-
我们可以直接通过下标(或索引)的方式调用指定位置的元素,速度很快。
-
数组的分类:
-
按照维度:一维数组、二维数组、三维数组、…
-
按照元素的数据类型分:基本数据类型元素的数组、引用数据类型元素的数组(即对
象数组)
Arrays工具类的使用
java.util.Arrays类即为操作数组的工具类,包含了用来操作数组(比如排序和搜索)的各种方法。
| 方法 | |
| :-: | :-: |
| boolean equals(int[] a,int[] b) | 判断两个数组是否相等 |
| String toString(int[] a) | 输出数组信息 |
| void fill(int[] a,int val) | 将指定值填充到数组之中 |
| void sort(int[] a) | 对数组进行排序 |
| int binarySearch(int[] a,int key) | 对排序后的数组进行二分法检索指定的值 |
===================================================================
-
面向过程(POP) 与 面向对象(OOP)
-
二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为,以函数为最小单位,考虑怎么做。面向对象,将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。
-
面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如抽象、分类、继承、聚合、多态等。
-
面向对象的三大特征
-
封装 (Encapsulation)
-
继承 (Inheritance)
-
多态 (Polymorphism)
-
类(Class)和对象(Object)是面向对象的核心概念。
-
类是对一类事物的描述,是抽象的、概念上的定义
-
对象是实际存在的该类事物的每个个体,因而也称为实例(instance)。
-
“万事万物皆对象
类的创建:
步骤:
-
定义类(考虑修饰符、类名)
-
编写类的属性(考虑修饰符、属性类型、属性名、初始化值)
-
编写类的方法(考虑修饰符、返回值类型、方法名、形参等)
-
创建对象语法: 类名 对象名 = new 类名();
-
使用“对象名.对象成员”的方式访问对象成员(包括属性和方法)
修饰符 数据类型 属性名 = 初始化值 ;
说明1: 修饰符
-
常用的权限修饰符有:private、缺省、protected、public
-
其他修饰符:static、final (暂不考虑)
说明2:数据类型
- 任何基本数据类型(如int、Boolean) 或 任何引用数据类型。
说明3:属性名
- 属于标识符,符合命名规则和规范即可。
什么是方法(method、函数):
-
方法是类或对象行为特征的抽象,用来完成某个功能操作。在某些语言中也称为函数或过程。
-
将功能封装为方法的目的是,可以实现代码重用,简化代码
-
Java里的方法不能独立存在,所有的方法必须定义在类里。
按照是否有形参及返回值
| | 无返回值 | 有返回值 |
| — | — | — |
| 无形参 | void 方法名(){} | 返回值类型 方法名(){} |
| 有形参 | void 方法名 (形参){} | 返回值类型 方法名(形参){} |
注意:
-
方法被调用一次,就会执行一次
-
没有具体返回值的情况,返回值类型用关键字void表示,那么方法体中可以不必使用return语句。如果使用,仅用来结束方法。
-
定义方法时,方法的结果应该返回给调用者,交由调用者处理。
-
方法中只能调用方法或属性,不可以在方法内部定义方法。
- 重载的概念
在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。
- 重载的特点:
与返回值类型无关,只看参数列表,且参数列表必须不同。(参数个数或参数类型)。调用时,根据方法参数列表的不同来区别。
-
构造器的特征
-
它具有与类相同的名称
-
它不声明返回值类型。(与声明为void不同)
-
不能被static、final、synchronized、abstract、native修饰,不能有return语句返回值
-
构造器的作用:创建对象;给对象进行初始化
-
根据参数不同,构造器可以分为如下两类:
-
隐式无参构造器(系统默认提供)
-
显式定义一个或多个构造器(无参、有参)
注意:
-
Java语言中,每个类都至少有一个构造器
-
默认构造器的修饰符与所属类的修饰符一致
-
一旦显式定义了构造器,则系统不再提供默认构造器
-
一个类可以创建多个重载的构造器
-
父类的构造器不可被子类继承
this是什么?
-
在Java中,this关键字比较难理解,它的作用和其词义很接近。
-
它在方法内部使用,即这个方法所属对象的引用;
-它在构造器内部使用,表示该构造器正在初始化的对象。
-
this 可以调用类的属性、方法和构造器
-
什么时候使用this关键字呢?
当在方法内需要用到调用该方法的对象时,就用this。
具体的:我们可以用this来区分属性和局部变量。
比如:this.name = name;
注意:
-
可以在类的构造器中使用"this(形参列表)"的方式,调用本类中重载的其他的构造器!
-
明确:构造器中不能通过"this(形参列表)"的方式调用自身构造器
-
如果一个类中声明了n个构造器,则最多有 n - 1个构造器中使用了"this(形参列表)"
-
"this(形参列表)"必须声明在类的构造器的首行!
-
在类的一个构造器中,最多只能声明一个"this(形参列表)"
为什么要有继承?
最后
文章中涉及到的知识点我都已经整理成了资料,录制了视频供大家下载学习,诚意满满,希望可以帮助在这个行业发展的朋友,在论坛博客等地方少花些时间找资料,把有限的时间,真正花在学习上,所以我把这些资料,分享出来。相信对于已经工作和遇到技术瓶颈的朋友们,在这份资料中一定都有你需要的内容。
-
在Java中,this关键字比较难理解,它的作用和其词义很接近。
-
它在方法内部使用,即这个方法所属对象的引用;
-它在构造器内部使用,表示该构造器正在初始化的对象。
-
this 可以调用类的属性、方法和构造器
-
什么时候使用this关键字呢?
当在方法内需要用到调用该方法的对象时,就用this。
具体的:我们可以用this来区分属性和局部变量。
比如:this.name = name;
注意:
-
可以在类的构造器中使用"this(形参列表)"的方式,调用本类中重载的其他的构造器!
-
明确:构造器中不能通过"this(形参列表)"的方式调用自身构造器
-
如果一个类中声明了n个构造器,则最多有 n - 1个构造器中使用了"this(形参列表)"
-
"this(形参列表)"必须声明在类的构造器的首行!
-
在类的一个构造器中,最多只能声明一个"this(形参列表)"
为什么要有继承?
最后
文章中涉及到的知识点我都已经整理成了资料,录制了视频供大家下载学习,诚意满满,希望可以帮助在这个行业发展的朋友,在论坛博客等地方少花些时间找资料,把有限的时间,真正花在学习上,所以我把这些资料,分享出来。相信对于已经工作和遇到技术瓶颈的朋友们,在这份资料中一定都有你需要的内容。