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放弃了原本的指向,变为一个没有指向的栈内存。
作于202003232200,已归档
———————————————————————————————————
本文为博主原创文章,转载请注明出处!
若本文对您有帮助,轻抬您发财的小手,关注/评论/点赞/收藏,就是对我最大的支持!
祝君升职加薪,鹏程万里!
文章来源: winter.blog.csdn.net,作者:Winter_world,版权归原作者所有,如需转载,请联系作者。
原文链接:winter.blog.csdn.net/article/details/105011239
- 点赞
- 收藏
- 关注作者
评论(0)