Java——类与对象(基本概念、定义、内存分析、引用传递)
时间:2022-07-25
本文章向大家介绍Java——类与对象(基本概念、定义、内存分析、引用传递),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1、面向对象简介
软件开发模式有两种:面向过程、面向对象。
- 面向过程:指的是只完成自己所需要的操作,但这种设计缺少可维护性;
- 面向对象:本质上来讲是一种组件化(模块化)设计。方便进行代码局部维护。但设计上要求的规范较多,且对整个项目的整体把控较为关键。
面向概念中有以下几个特点:
- 封装性:保护内部的操作对外不可见;
- 继承性:相当于一代代传承;
- 多态性:在一个范围内的定义改变。
面向对象的开发中有三个阶段:
- OOA:面向对象分析;
- OOD:面向对象设计;
- OOP:面向对象编程;
2、类与对象
2.1、类与对象基本概念
类指的是具备某一共性的群体集合。而对象是一种个性的描述。对象包含具体的信息内容。对象所能具备的操作行为实际上由类定义的,要想使用类要有具体的描述对象,对象是可以明确使用的,而类是不能直接使用的。
2.2、类与对象的定义
开发中先有类,再有对象,要定义类,Java中使用class关键字来描述,而在类中组成包括:属性(变量)、方法。
class Person{
String name;
int age;
public void tell(){
System.out.println("hello");
}
}
2.3、对象内存分析
类属于引用数据类型,先对其进行内存分析,分析前首先给出两块内存控件的概念:
- 堆内存空间(Heap):保存对象中具体的属性信息;
- 栈内存空间(Stack):保存的堆内存的地址数值,简化一点,假设保存在栈内存中的是对象的名称。一个栈内存只能保存一块对应的堆内存的地址空间。
按以上分析,可以得出如下内存关系图:
1)声明并实例化对象:Person per = new Person();
2)分步,先声明,再实例化:Person per= null; per = new Person();
注意:关于引用数据类型操作存在的重要问题
当对象开辟堆内存时,即实例化对象,属性才会进行内存的分配,那么如果使用了没有实例化的对象,程序编译OK,但是执行时会返回NullPointerEcepition异常,原因就是使用了没有开辟堆内存空间的引用对象。
2.4、引用传递初步
引用传递是在引用数据类型上所用的一个操作定义,是Java的精髓,操作性质与C语言相同,进行内存的操作。换到程序中,就是一个堆内存空间可以被多个栈内存所指向。
【举例】:引用传递
Person perA = new Person();
perA.name = "张三";
perA.age= 30;
Person perB = perA
perB.name = "李四";
以上是采用了声明对象的方式进行引用数据类型的接收,如果两个对象都已经实例化并有内容会是什么效果?
【举例】:观察引用传递
Person perA = new Person();
Person perB = new Person();
perA.name = "张三";
perA.age= 30;
perB.name = "王五";
perB.age= 10;
perB = perA;
perB.name = "赵六";
//输出perA,可观察到"赵六",30
以上分析可知:
- 使用关键字new 可以开辟堆内存空间(保存属性);
- 栈内存只能保存一块堆内存的使用地址;
- 引用传递的本质是同一块堆内存空间可以被不同的栈内存所指向;
- 发生引用传递时,如果操作的栈内存原有堆内存指向,则改变堆空间意味着改变内存指向;
- 若某一个堆内存空间没有被任何的栈内存所指向,则会产生垃圾空间,会自动被GC(Garbage Collector,垃圾收集器)回收并且释放(垃圾回收执行时间不确定,所以做好少产生垃圾空间)。
除了改变引用可以产生垃圾空间,还可以设置为null,eg:perB = null,这样perB放弃了原本的指向,变为一个没有指向的栈内存。
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释