JavaSE第九章 对象的创建和使用

一、对象的创建和使用

1. 类的定义

  • 语法格式
[修饰符列表] class 类名{
    // 类体 = 属性 + 方法
    // 属性在代码中以“变量”的形式存在(描述状态)
    // 方法描述动作/行为
}
  • 修饰符列表可以省略
  • 为什么属性是以“变量”的形式存在的:
    因为属性对应的是“数据”,数据在程序中只能放到变量中
    属性其实就是变量(成员变量)

2. 对象的创建

  • 类定义之后,就可以使用这个“模板”来创建“对象”了,一个类可以创建多个对象
  • 语法格式
类名 变量名 = new 类名();
  • 其中,“=”左边的类名同时也可以称为“类型名”,属于引用数据类型
  • Java 语言当中凡是使用 class 关键字定义的类都属于引用数据类型,类名本身就是这种引用数据类型的类型名
  • 实例变量
    对象又被称为实例,实例变量实际上就是对象级别的变量,即每个对象对应“自己的”实例变量——“一个对象一份”,堆内存中存储对象,以及对象的实例变量
    在 Java 语言当中,当实例变量没有手动赋值,在创建对象的时候,也就是说在 new 的时候,系统会对实例变量默认赋值(这个默认值是在调用构造方法的时候完成赋值的):
  • 对象和引用的区别
    对象是通过new出来的并存储在堆内存当中,而对象的内存地址赋值给了一个变量,这个变量保存了这个内存地址并指向对象,这个变量被称为引用,引用可以是局部变量,也可以是实例变量(成员变量)
    在Java中,没有指针的概念,即没有权力直接操控堆内存当中的内存空间,所以只能通过引用的方式来访问堆内存中的对象
  • 访问实例变量:
    两种形式:读取与修改
    不能通过“类名”直接访问“实例变量”,必须创建对象之后才能访问
    访问语法格式:
引用.实例变量名

修改语法格式:
通过“=”赋值的方式,重新赋值,就改变了堆里的实例变量值

引用.实例变量名=;

二、JVM内存管理

1. 程序计数器

  • 可以看做当前线程所执行的字节码的行号指示器
  • 特点:线程私有的内存

2. Java虚拟机栈

  • 描述的是 Java 方法执行的内存模型,每个方法在执行的时候会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、返回地址、方法出口等信息,每个方法从调用直至完成的过程,就对应一个栈帧从入栈到出栈的过程
  • 特点:线程私有,生命周期和线程相同
  • Java虚拟机栈通常会抛出两种异常:
  1. StackOverflowError 异常:线程请求的深度大于虚拟机所允许的深度
  2. 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. 构造方法重载

  • 方法重载条件:在同一个类中、方法名相同、参数列表不同(参数个数、顺序、类型不同)
  • 构造方法支持方法重载,即在一个类中构造方法可以有多个,并且构造方法名(都是类名)都是一样的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Jayco-J

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

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

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

打赏作者

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

抵扣说明:

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

余额充值