菜鸟笔记 -- Chapter 6.1 面向对象概述
6.1 面向对象概述
在程序开发的初期人们使用结构化开发语言,但是随着时间的流逝,软件的规模越来越庞大,结构化语言的弊端逐渐暴露出来,开发周期被无限制拖延,产品质量也不尽如人意,人们终于发现结构化语言已经不再适合当前的软件开发。这时人们开始将另一种开发思想引入程序中,即面向对象的开发思想。面向对象思想是人类最自然的一种思考方式,它将所有预处理的问题抽象为对象,同时了解这些对象具有哪些相应的属性以及展示这些对象的行为,以解决这些对象面临的一些实际问题,这样就在程序开发中引入可面向对象设计的概念,面向对象设计实质上就是对现实世界的对象进行建模操作。
增强:结构化开发语言:结构化语言就是将自然语言加上程序设计语言的控制结构就成了结构化语言,专门用来描述加工逻辑。所以,它既有自然语言灵活性强、表达丰富的特点,又有结构化程序的清晰易读和逻辑严密的特点。也是一种用于数据库查询和编程的语言,已经成为关系型数据库普遍使用的标准,使用这种标准数据库语言对程序设计和数据库的维护都带来了极大的方便,广泛地应用于各种数据查询。VB和其他的应用程序包括Access、Foxpro、Oracle、SQL Server等都支持SQL语言。
6.1.1 类与对象
对象是事物存在的实体,将对象分为两个部分,即静态部分(属性)与动态部分(行为),静态部分指的是不具有功能性质的部分,这部分也被叫做成员变量。动态部分是指具备的行为,也即成员方法,人们通过观察对象的属性和行为来探讨和了解对象。
类是封装对象属性和行为的载体,是对现实世界中具有相同属性(成员字段)和行为(成员方法)的一类事物的抽象统称;是构造对象时所依赖的规范。在Java语言中,类中对象的行为是以方法的形式定义的,对象的属性是以成员变量的方式定义的。
实际开发中类是对具有相同功能的事物的抽象,而对象则是类的一个实例,我们通过操作对象来使用类提供的属性和功能,类的封装保护了代码的完整性。类经过加载后被放在了永久代【JDK1.8后永久代被取消,改为本地元数据空间】,而对象一经创建在堆中分配空间,对象的内存结构如下:
在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。
6.1.1.1 对象头
HotSpot虚拟机的对象头包括两部分信息:
第一部分markword,用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分数据的长度在32位和64位的虚拟机(未开启压缩指针)中分别为32bit和64bit,官方称它为“MarkWord”。
另外一部分是klass,类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例.
6.1.1.2 实例数据
实例数据部分是对象真正存储的有效信息,也是在程序代码中所定义的各种类型的字段内容。无论是从父类继承下来的,还是在子类中定义的,都需要记录起来。
6.1.1.3 对齐填充
第三部分对齐填充并不是必然存在的,也没有特别的含义,它仅仅起着占位符的作用。由于HotSpot VM的自动内存管理系统要求对象起始地址必须是8字节的整数倍,换句话说,就是对象的大小必须是8字节的整数倍。而对象头部分正好是8字节的倍数(1倍或者2倍),因此,当对象实例数据部分没有对齐时,就需要通过对齐填充来补全。
6.1.1.3 对象大小计算
在32位系统下,存放Class指针的空间大小是4字节,MarkWord是4字节,对象头为8字节。在64位系统下,存放Class指针的空间大小是8字节,MarkWord是8字节,对象头为16字节。64位开启指针压缩的情况下,存放Class指针的空间大小是4字节,MarkWord是8字节,对象头为12字节。
数组长度4字节+数组对象头8字节(对象引用4字节(未开启指针压缩的64位为8字节)+数组markword为4字节(64位未开启指针压缩的为8字节))+对齐4=16字节。
静态属性不算在对象大小内。属于类成员。【对象成员:只能通过对象调用的,类成员:可以通过类名称直接调用的。】
总结:通过上面我们可以看出,对象实际就是对类的一种变相copy【只copy了成员变量】,然后对这些成员变量操作的函数通过指针从方法区加载在栈内存。这样保证了类数据的完整性和类的复用性。
6.1.2 简述面向对象
面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节;这种思想是将数据作为第一位,而方法或者说是算法作为其次,这是对数据一种优化,操作起来更加的方便,简化了过程。面向对象有三大特征:封装性、继承性、多态性,其中封装性指的是隐藏了对象的属性和实现细节,仅对外提供公共的访问方式,这样就隔离了具体的变化,便于使用,提高了复用性和安全性。对于继承性,就是两种事物间存在着一定的所属关系,那么继承的类就可以从被继承的类中获得一些属性和方法;这就提高了代码的复用性。继承是作为多态的前提的。多态是说父类或接口的引用指向了子类对象,这就提高了程序的扩展性,也就是说只要实现或继承了同一个接口或类,那么就可以使用父类中相应的方法,提高程序扩展性,但是多态有一点不好之处在于:父类引用不能访问子类中的成员。
举例来说:就是:比如说你要去饭店吃饭,你只需要饭店,找到饭店的服务员,跟她说你要吃什么,然后就会给你做出来让你吃,你并不需要知道这个饭是怎么错做的,你只需要面向这个服务员,告诉他你要吃什么,然后他也只需要面向你吃完收到钱就好,不需要知道你怎么对这个饭进行吃。
面向过程的思维:吃(猪八戒,西瓜); 面向对象的思维:猪八戒.吃(西瓜);
6.1.2.1 特点:
1:将复杂的事情简单化。
2:面向对象将以前的过程中的执行者,变成了指挥者。
3:面向对象这种思想是符合现在人们思考习惯的一种思想。
6.1.2.2 面向对象的三大特征简述
面向对象具有三个最重要的特性:封装,继承、多态
封装:只隐藏对象的属性和实现细节,仅对外提供公共访问方式
l 好处:将变化隔离、便于使用、提高复用性、提高安全性
l 原则:将不需要对外提供的内容隐藏起来;把属性隐藏,提供公共方法对其访问
继承:提高代码复用性;继承是多态的前提
多态是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象
l 好处:提高了程序的扩展性
l 弊端:当父类引用指向子类对象时,虽提高了扩展性,但只能访问父类中具备的方法,不可访问子类中的方法;即访问的局限性。
l 前提:实现或继承关系;覆写父类方法。