文章目录
对象与类
递归
递归的使用限制:
- 合法的递归,要求有递归体语句和递归出口。如果无限递归下去,会发生栈溢出错误(
java。lang.StackOverflowError
) - 即便有出口的递归,递归深度也不能超过栈空间的大小
- 不可以**“只递不归”**
堆空间最大容量
long maxMemory = Runtime.getRuntime().maxMemory();
System.out.println(maxMemory/1024/1024);
案例
- 斐波那契数列
- 阶乘
- 爬楼梯次数
对象与类
对象
对象(object):对象是面向对象程序设计的核心,Java是面向对象的编程语言。
特点:
- 属性:个体的状态信息(数据)
- 行为:个体能够做什么(操作)
类
类(class):创建对象的“模板”。类就是抽取了同类别的所有对象属性和行为上的共性。
类与对象的关系
同一个类描述相同类型不同对象的共有的属性和行为
同一个类创建出不同的对象
定义类
- 类本身
- 类中结构
1)成员变量:描述不同对象的共有属性
语法:权限修饰符 数据类型 变量名;
成员位置:类体中,方法外部,局部位置之外的位置
其中:数据类型可以是基本数据类型,也可以是引用数据类型
命名要求:小驼峰
注意:成员变量作用范围,在整个类体中生效,在整个类中的成员变量都可以访问它
2)成员方法:描述不同对象的共有行为
语法:权限修饰符 方法返回值类型 方法名(形参列表) { 方法体 }
注意:1) 修饰符里不含static
;2)修饰符跟之前保持一致先用public
(不要用static
);3)其余的特性跟之前的static
的方法是一致的。
语法:
权限修饰符 class 类名{
类体
}
其中:
权限修舒服可以是public
,也可以不写。
一个java文件中只能有一个public
的类。
类的命名要求:大驼峰
创建对象与使用
创建对象的语法:类名 对象名 = new 类名();
对象的使用:
- 打印对象名 —> 得到的是这个对象的地址值(
全类名@地址值
) - 可以使用
==
比较运算符进行比较,引用数据类型比较的是地址值
引用数据类型
自定义数据类型
自己定义的class
类,表示我们自己定义了一种全新的数据类型
基本数据类型
又称为java内置的数据类型,JVM知道其结构、大小等信息,直接使用
而对于自己定义的类,JVM不认识,需要JVM认识自己写的类,认识的过程称为类加载
类加载
- 类加载的具体过程,我们后面会详细学习。这里我们先不用了解它的详细过程。
- 类加载是通过把某个类的**二进制字节码文件(class文件)**通过I/O流的形式,读取进JVM内存中的方法区实现的。
- 通过读取二进制字节码文件,并加载进JVM内存。这是JVM了解这个类型的过程。
- 类加载之后,就可以做很多类型相关的操作了。
- 类加载要在创建对象之前进行,换句话说创建一个类的对象必然触发该类的类加载!
注意
- 一个程序在运行过程中,一个类只加载一次,如果这个类已经加载了,下次就不再加载了
- 类加载是“懒加载”,比较懒,不用的时候不加载,用到的时候再加载
类加载的时机
- 执行
main
方法会触发类加载 - 首次创建对象的时候会触发类的加载
eg:
小结
- 第一步是默认初始化,赋予默认值
- 第二步是显示赋值,声明定义成员变量的时候直接
=
赋值 - 最后是通过
对象名.成员变量名
修改的,是在原有的基础上进行覆盖
局部变量 VS 成员变量
1. 在类中定义的位置不同
局部变量 ----> 局部位置
成员变量 ----> 成员位置
2. 在内存中的位置不同
局部变量 ----> 栈上
成员变量 ----> 堆上
3. 生命周期不同
局部变量 ----> 跟方法同生共死
成员变量 ----> 跟对象保持一致
4. 有无默认初始化不同
局部变量 ----> 没有默认值,要使用必须初始化
成员变量 ----> 有默认值,引用类型默认值是null
5. 作用范围
局部变量 ----> 作用域内生效
成员变量 ----> 整个类中,在类中的成员方法都能访问
就近原则:优先访问的是局部变量。如果非要访问成员变量,就要用this关键字。
this关键字
this可以区分在局部变量和成员变量同名的时候(通过this.
访问的就是成员变量)
说明:
this
是一个引用,指向的是当前对象- 当前对象:当用
对象.方法名(实参列表)
进行成员方法调用的时候,当前对象就是这个调用方法的对象
this关键字的用途
- 在成员方法中,用this引用去访问类中成员变量和调用类中成员方法。
- 由于this本身就是隐含的,所以一般情况下,可以省略this,直接访问类中成员。
- 特殊情况下,当成员方法中的局部变量和成员变量同名时,可以用"this.访问"来表示访问同名成员变量,来和同名局部变量做区分。这种情况,this是不能省略的。
- 在成员方法中只要使用
this.访问
一个变量,那么该变量一定是成员变量。在代码比较复杂的情况下,可以显著增加代码可读性。 get
和set
方法也会使用到this
注意事项
this
指向当前对象的隐含传参,必须是在普通成员方法中,加上static
的方法中,没有该this
传参,在静态方法中不能访问类成员(非静态的),没有对象- 不同的
this
指向的对象必然不同
构造方法
语法
[访问权限修饰符] 类名(形参列表){
// 构造方法体
}
说明
- 权限修饰符 ----> 先写成
public
- 没有
static
- 没有方法的返回值类型
- 方法名跟类名一摸一样
- 形参列表跟之前说的方法一样
- 构造方法跟之前的方法一样,可以写一些代码,构造方法体内定义的变量还是局部变量
- 形参列表可以为空 —> 无参默认构造方法;如果非空 —> 有参构造方法
作用
给成员变量进行赋值的
说明
使用:new 类名(实参列表)
- new关键字去创建对象的时候,JVM自动去调用构造方法,构造方法无法通过普通方法的调用方式调用。
- 构造器的作用不是创建对象,创建对象是JVM的事情。构造器只是告诉JVM在创建对象过程中,给成员变量赋什么值。
注意事项
- 类中如果没有写任何构造方法,会存在一个默认的无参构造方法
- 类中如果已经有了其他构造方法,默认隐藏的无参构造方法就不存在了
- 一个类中,是允许同时定义多个构造方法的,即构造方法重载,多个构造器的形参必须不同
- 构造方法的名字必须和类名一模一样
- 构造器没有返回值
- 构造器是完成对象的初始化(给对象赋值), 并不是创建对象, 创建对象时, 系统根据实参列表自动调用该类的构造器
- 在构造器中也会隐含
this
传参, 我们可利用this
对成员变量进行赋值, 也可以使用快捷键,alt + insert
快速生成构造器. - 构造器中也可以用
this
表示调用其他的构造器,必须在构造方法的第一行。语法:this(实参列表)
构造器的赋值顺序
- 第一步永远是默认赋值
- 显示赋值
- 最后一步永远是构造器赋值