Java基础

目录

1、JVM、JRE和JDK 

2、IDEA使用

3、数据类型 运算符

3.1 基本数据类型

3.2 引用数据类型

3.3 运算法

4、流程控制

4.1 顺序执行

4.2 分支执行

4.2.1  if   if-else   if-else if - else

4.2.2 switch

4.3 重复执行

4.3.1 while

4.3.2 do...while

4.3.3 for

4.3.4 break continue

5、面向对象

5.1 类和对象

5.2 属性 

5.3 方法

5.3.1 方法中的参数

5.3.2 变量作用域

5.3.3 静态static

5.4 包

5.4.1 package

5.4.2 import

5.5 构造函数

5.6 继承 Extends

5.6.1 基本语法

5.6.2 

5.7 多态

5.8 方法重载

5.9 方法重写

5.10 递归

5.11 访问权限

5.12 内部类​编辑

5.13 单例模式

5.14 final 

5.15 抽象-Abstract

5.16 接口-interface

5.17 枚举-enum

5.18 匿名类

5.19 bean规范

5.20 作用域

6、常用类和对象

6.1 object

6.2 数组

6.2.1 一维数组

6.2.2 二维数组

​编辑

6.2.3 冒泡排序

6.2.4 选择排序

6.2.5 二分查找法

6.3 字符串

6.3.1 字符串创建

6.3.2 拼接

6.3.3 比较

6.3.4 截取

6.3.5 替换

6.3.6 大小写转换

6.3.7 查找

6.3.8 StringBuilder

6.4 包装类

6.5 日期类 Date

6.6 日历类 Calendar

6.7 工具类

6.8 比较

7、异常

7.1 介绍

7.2 基础语法

7.3 异常

7.4 转换异常

7.5 自定义异常

8、集合 

 8.1 介绍

8.2 ArrayList

8.2.1 基本操作

8.2.2 常用方法

8.3 LinkedList

8.3.1 基本操作

8.3.2 常用方法

8.4 泛型

8.4.2 基本使用

8.5 比较器

8.6 ArrayList vs LinkedList

8.7 HashSet

8.7.1 介绍

8.7.2 常用方法

8.8 Queue

8.9 HashMap

8.9.2 常用方法

8.10 Hashtable

8.12 工具类

8.13 问题汇总

9、IO  

9.1 数据流​编辑

9.2 文件流

9.3 文件复制

9.4 缓冲流

9.5 字符流

9.6 序列化

9.7 常见异常

10、线程  

10.1 线程中的进程

10.2 进程中的线程

10.3 创建线程

10.4 线程的生命周期

10.5 线程的执行方式(串行,并发)

10.6 线程休眠

10.7 工作

10.8 线程池

10.9 同步 synchronized

10.10 阻塞

10.11 安全问题

11、反射

11.1 基础

11.2 类加载器

11.3 练习


Java基础知识点总结归纳,超级全面!(2021版)_java复习基础-CSDN博客

1、JVM、JRE和JDK

 

2、IDEA使用

(1)IntelliJ IDEA中右键新建时,选项没有Java class的解决方法和具体解释:
IntelliJ IDEA认为这个文件不是 项目/模板 ,虽然项目或者模板其实也是一个文件夹,但是你要让IntelliJ IDEA知道这是一个可以创建Java class类的文件(项目 / 模板):请File—>Project Structure—>Modules。选择刚才的包,单击Sources。添加到源中

(2)运行流程:我用的JDK11

3、数据类型 运算符

3.1 基本数据类型

数值类型
浮点类型:默认小数点是双精度double,所以float=1.0会报错,需要指定是单精度float f=1.0f或F
字符类型:使用符号标识文字char c = '@'; 
布尔类型:true false

基本数据类型之间的转换:
byte不能转char,因为char无负数

3.2 引用数据类型

即可以被引用的数据类型
String s = “abc”; 但要注意int i = 10不称为引用数据类型,应为后者10直接写在了i的地址中,而s中写的是abc的地址,算是一种引用。

3.3 运算法

4、流程控制

4.1 顺序执行

代码出现的先后顺序和语法的先后顺序 

4.2 分支执行

4.2.1  if   if-else   if-else if - else

4.2.2 switch

这是一种等值判断
i = 10,匹配到第一个,接下来就是从输出分支1开始顺序执行,输出分支2 分支3;若i=20,输出分支2 分支3;因为没有写break;都不匹配直接全跳过,可以在最后加上default。

4.3 重复执行

4.3.1 while

while(true){
        循环代码;
}
先判断再执行,直到()中为false才结束

4.3.2 do...while

do {
        循环代码;
}while(true)
先执行再判断,直到()中为false才结束

4.3.3 for


还有一种 for 的写法:

4.3.4 break continue

break:跳出整个循环
continue:跳过本循环

break 跳出总上一层循环,不再执行循环(结束当前的循环体)

continue 跳出本次循环,继续执行下次循环(结束正在执行的循环 进入下一个循环条件)

return 程序返回,不再执行下面的代码(结束当前的方法 直接返回)

5、面向对象

5.1 类和对象


等号左边声明了一个变量,右边创建了一个对象,然后将对象赋值给了变量,可用下图表示:

5.2 属性 

5.3 方法

5.3.1 方法中的参数

1、不传参数

2、基本的传参,考虑传参个数,顺序,类型

3、存在可变参数(即,有好几个参数但数目不定,类型相同)

5.3.2 变量作用域

输出10,因为传的是形参,test()执行结束后,该函数内部的i就释放了,对main中的i没有影响!

5.3.3 静态static

  • 被static修饰的变量或者方法是独立于该类的任何对象,也就是说,这些变量和方法不属于任何一个实例对象,而是被类的实例对象所共享。
  • 在该类被第一次加载的时候,就会去加载被static修饰的部分,而且变量只在类第一次使用时加载并进行初始化,注意这是第一次用就要初始化,后面根据需要是可以再次赋值的。
     
  • static变量值在类加载的时候分配空间,以后创建类对象的时候不会重新分配。赋值的话,是可以任意赋值的!(这句话在单例模式中再一次深刻体现出来!)
  • 被static修饰的变量或者方法是优先于对象存在的,也就是说当一个类加载完毕之后,即便没有创建对象,也可以去访问。

1、使用方法

2、静态 和 非静态 的关系

(1)先有类 再有对象!!!

使用时,对象也能访问静态属性和方法——原因先有类 再有对象!!!
class中定义方法时:
        
非静态方法可以调用静态属性和方法——原因非静态的方法时面向对象的,使用时一定是对象打点访问,而有对象就是有类了。
        静态方法可能调用非静态属性或方法吗?—— 不能。因为使用类调用时,未必有对象。

(2)代码块


类被第一次加载的时候(创建对象就会加载类,或是直接使用类名调用静态函数或属性),就会去加载被static修饰的部分(注意只有第一次加载类才会调用),但“代码块执行1”不会输出,因为不是静态的。“代码块执行1”在每次创建对象时,会自动调用。

5.4 包

5.4.1 package

5.4.2 import

import是用来导入其他包中的类的

5.5 构造函数

在使用new创建对象时,也就是在构建对象,需要调用一个构造函数,所以上图中划横线的()就是在调用构造函数,是一个无参数的构造函数。
若有参数,在new时需要传参;
!代码块,是在构造对象之前执行的

5.6 继承 Extends

5.6.1 基本语法


1、当父类和子类中存在名字一样的属性时:super & this
默认,this省略。

当父类和子类中存在一样方法时,方法重写。

2、父类对象是在每个子类对象创造前创建

所以,创建对个子类对象时,每个对象都会链接到一个父类对象上(只是这样说,实际是内存分配的问题)

运行结果:其实是因为在调用子类的构造函数Child2()时,JVM默认执行的第一条指令不是输出child这一行,而是隐藏了的 super(); 这一行的含义是调用父类的构造函数。
        所以如果父类自己定义了构造函数,且有参数时,需要在子类的构造函数中显式的使用super方法构建父类对象,传入合适的参数。

5.6.2 

5.7 多态

三种Person对象的创建都可以,因为子类已经继承了父类。通俗说就是把子类当做父类用
但是使用p1或p2来调用子类中特有的函数或属性就不对了,因为这两个对象是Person,不具备子类特有的内容
        所以 —— 多态语法其实就是对对象的使用场景进行了约束! 
                —— 一个对象可以使用的功能取决于引用变量的类型!

5.8 方法重载

1、构造函数也存在方法的重载!

2、如果想要在一个构造函数中调用其他构造函数,使用关键字 this:

3、基本数据类型在匹配方法时,可以在数值不变的情况下,扩大数据精度

此时输出:bbb
如果把方法1删了,那么输出sss(找不到匹配的类型,逐步扩大精度,byte是4bit,short是16bit,int是32bit);再把方法2也删了,输出iii(byte不能转char)。

注意这是对于基本数据类型而言,如何是类对象找不到合适的,会向前找父类。ex没截图。P54中

5.9 方法重写

父类和子类有一样的方法(注,方法一样说明参数也一样哦!要不然不是一个方法),怎么办?

当然也能像属性一样使用super:

方法重写的要求:子类父类方法相同,名一样,返回值类型一样,参数列表一样。
所以构造方法可以重写吗?—— 不能,名字就不一样。

易错点:

创建对象:
CCC ccc = new CCC();  System.out.println(ccc.sum());  输出:20
DDD ddd = new DDD();  System.out.println(ddd.sum());  输出:40
CCC ccc = new DDD();  System.out.println(ccc.sum());  输出:40

根据上面两句高亮的话,ccc是CCC类型,所以可以使用sum,但是具体如何用,看ccc是什么对象,是DDD对象,所以实际运行的是DDD中的sum。
(方法:编译看左,执行看右)
如果删去DDD中的sum呢?输出:20
原因——上面图中没有高亮的两句话。ccc在使用属性变量时能使用什么属性仍然看类型,因为是CCC类型,所以可以使用变量i,但如何使用和方法的规则不同了,变量的使用不看对象,在哪里声明在哪里使用!即因为调用的是父类的sum,而父类的sum中的 i 是在父类中声明的,所以i=10,结果为20。同样在没删子类sum时,执行的是子类的sum,子类sum中的 i 是在子类中有声明的,默认是 this.i 哦(若子类没有声明,继承父类的i=10),所以i=20,结果为40.

如果父类子类改为:

CCC ccc = new DDD();  System.out.println(ccc.sum());  输出:30
因为——方法直接或间接调用都是:能不能用看类型,怎么用看对象!
所以sum执行的是CCC中的,但是因为ccc是DDD对象,getI()仍是先从子类找起,子类有,所以执行的是子类的getI(),此时getI中的 i 也是this.i,即子类声明的 i=20。

5.10 递归

求等差数列:

5.11 访问权限

函数内定义的变量只在该函数内{ }起作用,在函数内找变量,先看自己函数内有没有,包括参数。

对于class的属性:


4中权限依次增大

 public

所以main方法需要是public,又因为main方法不需要创建类对象就能调用执行,所以必须加上static,如果取消,可以发现main无法直接执行了,需要创建对象来调用。

default
默认,当前包下,这与父包子包无关,必须是当前路径

protected
子类可以访问,即使是不同包的子类也能。
指的是子类class内部可用,但若是在又在另一个class中创建了该子类对象,再用对象访问protected,不可行:下图自己悟吧,所有类默认继承Object类。

public

5.12 内部类

5.13 单例模式


在上面1和2的情况下,会考虑将构造函数设置为private,禁止随意创建对象。
所以又写了一个public的static的创建对象函数,可以在main中使用类名直接调用来创建对象,
但如果是这样的:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值