天天看点

【Java】类和对象

前言

Java语言是一种面向对象的语言。面向对象的思想在七十年代的时候由IBM的SmallTalk语言最先推广。面向对象可理解为一种开发模式。早期的计算机编程使用的是面向过程的方法,其特点是针对某一问题单独提出解决方案以及代码开发。而面向对象是一种以组件化的形式进行代码设计。组件化使得代码重用性高,维护也比较方便。

Java面向对象的特征

面向对象有三大特性:

  • 封装性

    通过合并特征和行为来创建新的数据类型,并且保护内部定义结构的安全性。

    【一种隐藏,隐藏具体实现细节实现对代码的保护】

  • 继承性

    在已有的程序结构上继续扩充新的功能。

  • 多态性

    通过分离做什么和怎么做,将对外的接口和实现分开,使得消除类型之间的耦合关系。对于从同一基类导出的类的对象做同一操作从而表现出不同的效果,就是多态的体现。

Java类和对象

类和对象之间的关系

类和对象是面向对象当中最为基础的组成单元。

类是对现实世界的事物的一种抽象,将现实的实体的特征抽象成数据和功能,并将这些数据和功能封装形成的新类型。

万物皆对象,对象是具有「类」类型的变量。类是用来描述对象结构,也是用来操作对象的模板。

类和对象的定义结构

类的定义:

Java中类的定义使用关键字

class

Class ATypeName{
  ...
}
           

在类中可定义两种类型的元素,Filed和Method:

  • Filed(字段/属性/成员/变量):表示特性的变量的集合
  • Method(方法/行为/成员函数):表示可以做某些事情

对象的定义,对象的定义有两种方式:

  1. 声明并实例化对象:

    类名称 对象名称 = new 类名称();

  2. 分步完成

    声明对象:

    类名称 对象名称 = null;

    实例化对象:

    象名称 = new 类名称;

Java中的数据类型分为引用数据类型。这里对象名称是引用类型,接近于C++中的引用。

关键字

new

的主要功能是开辟内存空间(不同于C++中的new,C++中的new完成了两个功能,开辟空间和初始化对象)。new后面的

类名称()

即该构造器完成对象属性的初始化。

对象的内存分配

在了解程序运行时,对象是怎么进行放置安排,尤其是内存空间是如何安排的,我们首先需要知道数据可以存于计算机的哪些地方。计算机中有五个地方可以存储数据:

  1. 寄存器

是最快的存储区,位于处理器内部,数量有限,一般不能被直接控制。

  1. 堆栈

位于通用RAM(随机访问存储器)中。堆栈指针通过向下移动可以分配内存,向上移动可以释放内存。这种快速分配内存的效率仅次与寄存器。创建程序时,Java系统必须知道存储在堆栈内所有项的确切生命周期,以便上下移动堆栈指针。这种方式会限制程序的灵活性,所以Java仅有部分数据存放于堆栈中,而Java中的对象引用恰好是存储在堆栈中的。

一种通用的内存池(也是位于RAM区),用于存放所有的Java对象。堆优于栈的好处是:编译器不需要知道存储的数据在堆里的存活时间是多少。因此,在堆里分配会具有很大的灵活性。有得必有失,在堆里清除过期对象的花费会比清除栈中的要高。

  1. 常量存储

常量值通常直接存放在程序代码内部,永远不会被改变。

  1. 非RAM存储

如果数据完全存活于程序之外,那么它可以不受程序的任何控制,当然在程序没有运行时也可以存在。两个基本的例子便是:流对象和持久化对象。“流对象”:对象被转换为字节流,发送给另一台机器。“持久化对象”:对象被放于磁盘中。因此,即使程序终止,它们也可以保持自己的状态。

回到Java对象在内存分配的问题上。堆内存保存着每一个对象的属性内容。在使用

new

关键字时就是在堆上开辟了一个新空间。栈内存中保存着是存储对象引用,其值便是指向对应存储了属性值的堆空间地址。

👀 需要注意:

一块没有被任何栈内存指向的堆空间就会成为垃圾空间,所有的垃圾空间会不定期地被垃圾收集器GC进行回收,回收后会释放其所占用空间。

小结

面向对象有三大特性即封装、继承和多态。类和对象是面向对象的基础,类是对对象操作的抽象,对象是通过类被实例化的。Java对象的引用是存储于栈中,对象本身的值存储于堆中,栈中的引用存储对象值所在堆中的地址。

每天进步一点点,不要停止前进的脚步~