04_对象与类

对象与类

递归

递归的使用限制:

  1. 合法的递归,要求有递归体语句和递归出口。如果无限递归下去,会发生栈溢出错误(java。lang.StackOverflowError
  2. 即便有出口的递归,递归深度也不能超过栈空间的大小
  3. 不可以**“只递不归”**

堆空间最大容量

long maxMemory = Runtime.getRuntime().maxMemory();
System.out.println(maxMemory/1024/1024);

案例

  1. 斐波那契数列
  2. 阶乘
  3. 爬楼梯次数

对象与类

对象

对象(object):对象是面向对象程序设计的核心,Java是面向对象的编程语言。
特点

  1. 属性:个体的状态信息(数据)
  2. 行为:个体能够做什么(操作)

类(class):创建对象的“模板”。类就是抽取了同类别的所有对象属性和行为上的共性。

类与对象的关系

同一个类描述相同类型不同对象的共有的属性和行为
同一个类创建出不同的对象

定义类

  1. 类本身
  2. 类中结构
    1)成员变量:描述不同对象的共有属性
    语法:权限修饰符 数据类型 变量名;
    成员位置:类体中,方法外部,局部位置之外的位置
    其中:数据类型可以是基本数据类型,也可以是引用数据类型
    命名要求:小驼峰
    注意:成员变量作用范围,在整个类体中生效,在整个类中的成员变量都可以访问它
    2)成员方法:描述不同对象的共有行为
    语法:权限修饰符 方法返回值类型 方法名(形参列表) { 方法体 }
    注意:1) 修饰符里不含static;2)修饰符跟之前保持一致先用public(不要用static);3)其余的特性跟之前的static的方法是一致的。

语法

权限修饰符 class 类名{
	类体
 }

其中:
权限修舒服可以是public,也可以不写。
一个java文件中只能有一个public的类。

类的命名要求:大驼峰

创建对象与使用

创建对象的语法类名 对象名 = new 类名();
对象的使用:

  1. 打印对象名 —> 得到的是这个对象的地址值(全类名@地址值
  2. 可以使用==比较运算符进行比较,引用数据类型比较的是地址值

引用数据类型

自定义数据类型

自己定义的class类,表示我们自己定义了一种全新的数据类型

基本数据类型

又称为java内置的数据类型,JVM知道其结构、大小等信息,直接使用
而对于自己定义的类,JVM不认识,需要JVM认识自己写的类,认识的过程称为类加载

类加载

  1. 类加载的具体过程,我们后面会详细学习。这里我们先不用了解它的详细过程。
  2. 类加载是通过把某个类的**二进制字节码文件(class文件)**通过I/O流的形式,读取进JVM内存中的方法区实现的。
  3. 通过读取二进制字节码文件,并加载进JVM内存。这是JVM了解这个类型的过程。
  4. 类加载之后,就可以做很多类型相关的操作了。
  5. 类加载要在创建对象之前进行,换句话说创建一个类的对象必然触发该类的类加载!
注意
  1. 一个程序在运行过程中,一个类只加载一次,如果这个类已经加载了,下次就不再加载了
  2. 类加载是“懒加载”,比较懒,不用的时候不加载,用到的时候再加载
类加载的时机
  1. 执行main方法会触发类加载
  2. 首次创建对象的时候会触发类的加载

eg:
在这里插入图片描述

小结
  1. 第一步是默认初始化,赋予默认值
  2. 第二步是显示赋值,声明定义成员变量的时候直接=赋值
  3. 最后是通过对象名.成员变量名修改的,是在原有的基础上进行覆盖

局部变量 VS 成员变量

1. 在类中定义的位置不同
局部变量 ----> 局部位置
成员变量 ----> 成员位置
2. 在内存中的位置不同
局部变量 ----> 栈上
成员变量 ----> 堆上
3. 生命周期不同
局部变量 ----> 跟方法同生共死
成员变量 ----> 跟对象保持一致
4. 有无默认初始化不同
局部变量 ----> 没有默认值,要使用必须初始化
成员变量 ----> 有默认值,引用类型默认值是null
5. 作用范围
局部变量 ----> 作用域内生效
成员变量 ----> 整个类中,在类中的成员方法都能访问

就近原则:优先访问的是局部变量。如果非要访问成员变量,就要用this关键字。

this关键字

this可以区分在局部变量和成员变量同名的时候(通过this.访问的就是成员变量)

说明

  1. this是一个引用,指向的是当前对象
  2. 当前对象:当用对象.方法名(实参列表)进行成员方法调用的时候,当前对象就是这个调用方法的对象

this关键字的用途

  • 在成员方法中,用this引用去访问类中成员变量和调用类中成员方法。
    • 由于this本身就是隐含的,所以一般情况下,可以省略this,直接访问类中成员。
  • 特殊情况下,当成员方法中的局部变量和成员变量同名时,可以用"this.访问"来表示访问同名成员变量,来和同名局部变量做区分。这种情况,this是不能省略的。
  • 在成员方法中只要使用this.访问一个变量,那么该变量一定是成员变量。在代码比较复杂的情况下,可以显著增加代码可读性。
  • getset方法也会使用到this

注意事项

  1. this指向当前对象的隐含传参,必须是在普通成员方法中,加上static的方法中,没有该this传参,在静态方法中不能访问类成员(非静态的),没有对象
  2. 不同的this指向的对象必然不同

构造方法

语法

[访问权限修饰符] 类名(形参列表){
	// 构造方法体
}

说明

  1. 权限修饰符 ----> 先写成public
  2. 没有static
  3. 没有方法的返回值类型
  4. 方法名跟类名一摸一样
  5. 形参列表跟之前说的方法一样
  6. 构造方法跟之前的方法一样,可以写一些代码,构造方法体内定义的变量还是局部变量
  7. 形参列表可以为空 —> 无参默认构造方法;如果非空 —> 有参构造方法

作用

给成员变量进行赋值的

说明

使用:new 类名(实参列表)

  1. new关键字去创建对象的时候,JVM自动去调用构造方法,构造方法无法通过普通方法的调用方式调用。
  2. 构造器的作用不是创建对象,创建对象是JVM的事情。构造器只是告诉JVM在创建对象过程中,给成员变量赋什么值。

注意事项

  1. 类中如果没有写任何构造方法,会存在一个默认的无参构造方法
  2. 类中如果已经有了其他构造方法,默认隐藏的无参构造方法就不存在了
  3. 一个类中,是允许同时定义多个构造方法的,即构造方法重载,多个构造器的形参必须不同
  4. 构造方法的名字必须和类名一模一样
  5. 构造器没有返回值
  6. 构造器是完成对象的初始化(给对象赋值), 并不是创建对象, 创建对象时, 系统根据实参列表自动调用该类的构造器
  7. 在构造器中也会隐含this传参, 我们可利用this对成员变量进行赋值, 也可以使用快捷键, alt + insert快速生成构造器.
  8. 构造器中也可以用this表示调用其他的构造器,必须在构造方法的第一行。语法:this(实参列表)

构造器的赋值顺序

  1. 第一步永远是默认赋值
  2. 显示赋值
  3. 最后一步永远是构造器赋值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coo1heisenberg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值