Java 复习 面向对象

Java面向对象

面向对象基本概念

面向对象即OOP其本质是以建立模型体现出来的抽象思维过程和面向对象的方法,是一种编程设计思维,也是一种思考问题的方式,是Java语言的核心部分。利用面向对象的思想,我们在设计程序的时候,将数据抽象化为对象,并以对象为单位进行程序设计。

类与对象

  1. 在 Java 语言中,最基本的单位就是类,类似于类型
  2. 类是一类事务的抽象
  3. 类也可以理解为一个模板或者设计图纸
  4. 类是一组具有相同特性(属性)与行为(方法)的事务集合
对象
  1. 一个对象对应的是一个类的实例,可以通过对象在别的类或者包调用可调用的属性或方法
  2. 对象的状态描述对象的基本特征,行为描述对象的功能
  3. 对象在堆中会有一个唯一的地址值来用来区分与别的对象
  4. 对象是一个类的具体实现

如何建立面向对象的思维

  1. 先整体,在局部
  2. 先抽象,再具体
  3. 能做什么,再怎么做

对象在内存中的存储

内存中的五个区域

  • 方法区
  • 虚拟机栈
  • 本地方法栈
  • 程序计数器
区域概述
  1. Java 堆
    Java 堆是 Java 虚拟机所管理的内存中最大的一块,是被所有线程都共享的内存区域。存在的唯一目的就是存放对象实例,几乎所有的对象实例都在这里进行分配内存。在现在,也并不是所有的对象实例都在堆里面分配内存,也有可能是在栈里面分配内存。由于堆占的空间比较大,又存放了各种的实例对象,因此 Java 虚拟机的垃圾回收机制主要管理这个区域。JVM 规范中规定堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。并且可以通过 -Xmx 和 -Xms 来扩展堆的内存大小,如果堆中没有足够的内存为实例分配,并且堆无法扩展时,就会报 OutOfMemoryError 异常
  2. 方法区
    与 Java 堆一样,方法区是各个线程共享的内存区域,此区域是用来存储类的信息(类的名称、字段信息、方法信息)、静态变量、常量以及编译器编译后的代码。JVM 规范中把方法区描述为堆的逻辑部分,但它却有一个别名叫做非堆(Non-Heap),目的就是与 Java 堆区分开。垃圾回收机制的思想为分代回收,垃圾回收机制在 Java 堆中划分一个部分成为永久代,用此区域来实现方法区,这样垃圾收集器就可以像管理 Java 堆一样管理这部分内存,而不必为方法区开发专门的内存管理器。

运行时常量池
运行时常量池是方法区的一个部分, class 文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期间生成的各种字面量和符号引用,这部分内容会在类加载后进入方法区的运行时常量池中。 Java 虚拟机堆 class 文件的每一部分(自然也包括常量池)的格式都有严格的规定,这样才会被虚拟机认可、装载和执行。

  1. 程序计数器
    程序计数器是一块较小的内存空间,可以看作当前线程所执行字节码的行号指示器。字节码解释器在工作中时下一步该干啥、到哪了,就是通过它来确定的。大家都知道在多线程的情况下,为了线程切换后能恢复到正确的执行位置,每个线程都有一个独立的程序计数器,各个线程之间的计数器互不影响,独立存储,我们称这类内存区域为**"线程私有"的内存。程序计数器是私有**的,线程执行 Java 方法,程序计数器记录的是正在执行的虚拟机字节码指令地址。此内存区域是 Java 虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域
  2. Java 虚拟机栈
    我们把 Java 内存粗糙的分为堆和栈,Java 虚拟机栈就是栈这一部分。和程序计数器一样,虚拟机栈也是线程私有的,它的生命周期和线程相同。每个方法在执行的同时都会创建一个栈帧(Stack Frame),每个栈帧对应一个被调用的方法,栈帧中用于存储局部变量表、操作数栈、动态数栈、方法出口等信息。每个方法从开始执行到结束都对应着栈帧在虚拟机栈中入栈到出战的过程。
  • 局部变量表: 顾名思义,它就是用来存储方法中的局部变量(包括在方法中生命的非静态以及函数形参),**对于基本类型,直接存值,对于引用类型的变量,存储指向该对象的引用(地址值)。**由于它只存放基本类型的变量、引用类型的地址和返回值的地址,这些类型所需空间大小已知且固定,所以当进入一个方法时,这个方法需要在栈帧中分配多大的局部变量空间是完全确定的,在方法运行期间也不会改变局部变量表的大小
  • 指向运行常量池的引用: 在方法执行过程中难免会使用到类中定义的常量,因此栈帧中要存放一个指向运行时常量池的引用
  • 方法返回地址: 当一个方法执行结束后,要返回到调用它的地方,因此在栈帧中需要保存一个方法返回地址
  1. 本地方法栈
    本地方法栈与虚拟机栈的功能非常的相似,区别不过是虚拟机栈为虚拟机执行 Java 方法服务,而本地方法栈为虚拟机执行 Native 方法服务。有的虚拟机并不会区分本地方法栈和虚拟机栈,比如Sun HotSpot虚拟机直接将两个合二为一

对象在内存中的存储

只对于堆和栈来说
栈: 先进先出 FILO(First In LastOut)
堆: 先进后出 FIFO(First In First Out)

  1. 一般来讲局部变量存在于栈,方法执行完内存就被释放
  2. 对象存在于堆中,对象不再被使用时,内存才会被释放
  3. 每个堆中内存的元素都有地址值
  4. 对象中的属性都是由默认属性的

对象四大特性

封装

概述
封装性就是隐藏实现细节,仅对外提供访问接口。实现细节部分包装、隐藏起来的方法
封装的形式: 属性的封装、方法的分装、类的封装、组件的封装、模块化封装、系统级封装
封装到好处: 模块化、信息隐藏、代码重用、插件化易于调试、具有安全性
封装的缺点: 会影响执行效率

继承

概述
继承是面向对象最显著的一个特征
继承是一个联结类的层次模型。并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。
对象的一个新类可以从现有的类中派生,这个过程成为类继承。新类能吸收已有类的数据属性和行为,并扩展新的能力。
新类的定义可以增加新的数据或者新的功能,也可以使用父类的功能,但不能选择性的继承父类(超类/基类)
这种继承使得复用以前的代码非常容易,能够大大的缩短开发的周期,降低开发费用

多态

概述
多态是面向对象的一个重要特征,指的是同一个实体同时具有多种形式,即同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态。可以把不同的子类对象都当作父类来看,进而屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的变成,统一调用标准。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题
实现多态三个必要条件

  1. 继承: 在多态中必须存在有继承关系的子类和父类
  2. 重写: 子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法
  3. 向上转型: 在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法
    基于继承实现的多态
    此多态是通过重写父类的同一方法的几个不同子类来体现的
    对于引用子类的父类类型,在处理该引用引用时,它适用于继承该父类的所有子类,子类对象的不同,对于方法的实现也就不同,执行相同的动作产生的行为也就不同
    基于接口实现的多态
    指向接口的引用必须是指定这实现了该接口的一个类的实例程序,在运行时,根据对象引用的实际类型来执行对应的方法
抽象

概述
抽象是把多个事务的共性的内容抽取出来,本质就是把我们关注的内容抽取出来,也就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意到与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分细节。抽象包括两个方面。一是过程抽象,二是数据抽象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值