Java自我学习路线
一、对象的创建和使用
1. 类的定义
- 语法格式
[修饰符列表] class 类名{
// 类体 = 属性 + 方法
// 属性在代码中以“变量”的形式存在(描述状态)
// 方法描述动作/行为
}
- 修饰符列表可以省略
- 为什么属性是以“变量”的形式存在的:
因为属性对应的是“数据”,数据在程序中只能放到变量中
即属性其实就是变量(成员变量)
2. 对象的创建
- 类定义之后,就可以使用这个“模板”来创建“对象”了,一个类可以创建多个对象
- 语法格式
类名 变量名 = new 类名();
- 其中,“=”左边的类名同时也可以称为“类型名”,属于引用数据类型
- Java 语言当中凡是使用 class 关键字定义的类都属于引用数据类型,类名本身就是这种引用数据类型的类型名
- 实例变量:
对象又被称为实例,实例变量实际上就是对象级别的变量,即每个对象对应“自己的”实例变量——“一个对象一份”,堆内存中存储对象,以及对象的实例变量
在 Java 语言当中,当实例变量没有手动赋值,在创建对象的时候,也就是说在 new 的时候,系统会对实例变量默认赋值(这个默认值是在调用构造方法的时候完成赋值的):
- 对象和引用的区别
对象是通过new出来的并存储在堆内存当中,而对象的内存地址赋值给了一个变量,这个变量保存了这个内存地址并指向对象,这个变量被称为引用,引用可以是局部变量,也可以是实例变量(成员变量)
在Java中,没有指针的概念,即没有权力直接操控堆内存当中的内存空间,所以只能通过引用的方式来访问堆内存中的对象 - 访问实例变量:
两种形式:读取与修改
不能通过“类名”直接访问“实例变量”,必须创建对象之后才能访问
访问语法格式:
引用.实例变量名
修改语法格式:
通过“=”赋值的方式,重新赋值,就改变了堆里的实例变量值
引用.实例变量名=值;
二、JVM内存管理
1. 程序计数器
- 可以看做当前线程所执行的字节码的行号指示器
- 特点:线程私有的内存
2. Java虚拟机栈
- 描述的是 Java 方法执行的内存模型,每个方法在执行的时候会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、返回地址、方法出口等信息,每个方法从调用直至完成的过程,就对应一个栈帧从入栈到出栈的过程
- 特点:线程私有,生命周期和线程相同
- Java虚拟机栈通常会抛出两种异常:
- StackOverflowError 异常:线程请求的深度大于虚拟机所允许的深度
- OutOfMemoryError 异常:虚拟机可以动态扩展,如果扩展无法满足申请到足够的内存
3. 本地方法栈
- 它与虚拟机栈所发挥的作用是相似的,区别是 Java 虚拟机栈为执行 Java 方法服务,而本地方法栈是为本地方法服务
- 特点:线程私有
本地方法栈通常会抛出两类异常:
StackOverflowError 和 OutOfMemoryError
4. Java堆
- 被所有线程共享的一块区域,在虚拟机启动时创建
- 特点:线程共享,存放的是对象实例(所有的对象实例和数组),GC 管理的主要区域(即垃圾回收主要针对堆内存),可以处在物理上不连续的内存空间
5. 方法区
- 存储已被虚拟机加载的类信息、常量、静态变量,即编译器编译后的代码等数据
- 特点:线程共享的区域
抛出异常 OutOfMemory 异常:当方法区无法满足内存分配需求的时候
三、方法调用时参数传递问题
- 在Java中,参数传递时和参数类型无关,无论是基本数据类型,还是引用数据类型,统一将变量中保存的那个“值”复制一份传递下去,这个“值”可能是一个字面量,也可能是一个Java对象的内存地址
四、空指针异常
NullPointerException
- "空引用"访问实例相关(实例变量+实例方法)的数据时,都会出现空指针异常(对象没有初始化,当调用了一个null的属性或方法时)
五、构造方法
1. 构造方法的定义及作用
构造方法是一种特殊的方法,通过构造方法可以完成对象的创建以及实例变量的初始化(实例变量没有手动赋值的时候,系统会赋默认值,这个默认值是在调用构造方法的时候完成赋值的)
- 当一个类没有提供任何构造方法,系统会默认提供一个无参数的构造方法,这个无参数的构造方法被称为缺省构造器;而当一个类中手动提供了构造方法,那么无参数的构造方法被覆盖,但是无参构造方法和有参构造方法都可以调用,建议将无参构造方法手动写出来(原因:当一个构造方法第一行既没有this(),又没有super()时,默认会有一个super(),表示通过当前子类的构造方法调用父类构造方法——>链接:super())
2. 如何调用构造方法
使用 new 运算符来调用构造方法
- 语法结构
new 构造方法名(实际参数列表);
3. 构造方法的语法结构
[修饰符列表] 构造方法名(形式参数列表){
构造方法体;
}
- 构造方法名和类名必须一致
- 构造方法不需要指定返回值类型,也不能写void
- 通常在构造方法体中给属性赋值,完成属性的初始化
4. 构造方法重载
- 方法重载条件:在同一个类中、方法名相同、参数列表不同(参数个数、顺序、类型不同)
- 构造方法支持方法重载,即在一个类中构造方法可以有多个,并且构造方法名(都是类名)都是一样的