1.2数据抽象

数据类型: 一组值和一组对这些值操作的集合
抽象数据类型(ADT): 将数据和函数实现关联,并将数据的表示方式隐藏起来.

1.2.1使用抽象数据类型

1.2.1.2继承的方法

toString()方法:Java所有数据类型都会继承此方法返回用String类型表示的该类型值(返回用字符串表示的该数据类型值的内存地址)

1.2.1.4对象

对象三大特性:状态,标识(内存中的位置),行为
引用是访问对象的一种方式,不同Java实现中对引用的实现细节不一样,但可认为引用就是内存地址

1.2.1.6调用实例方法

静态方法主要作用:实现函数
非静态(实例)方法主要作用:实现数据类型的操作

1.2.1.8赋值语句*

原始数据类型的”x=y”将y值复制到x中,对于引用类型,复制的是引用

1.2.1.9将对象作为参数*

原始数据类型———将参数值的副本传递给方法(桉值传递)
引用类型———传递引用的值(复制引用)

1.2.1.10将对象作为返回值

Java方法只能有一个返回值,但有了对象实际上就能返回多个值

1.2.1.11数组也是对象*

Java中,所有非原始数据类型的值都是对象,因此数组作为参数时,也是传递了引用的副本

1.2.1.12对象的数组*

Java中,对象数组即是一个由对象的引用组成的数组,而非对象本身.如果对象非常大,在移动时只需操作引用而非对象本身,提高效率;对象很小时,操作引用反而会降低效率.

小结:运用数据抽象的思想编写代码(定义和使用数据类型,将数据类型的值封装在对象中)的方式称为面向对象编程.

1.2.2抽象数据类型举例

1.2.2.3字符串

String和字符数组类似,但String可以直接使用字符串字面量而非构造函数来创建并初始化字符串

为什么不使用字符数组代替String?:为了使diamante更简洁清晰,且String有许多实例方法可供使用.


1.2.3抽象数据类型的实现

根据抽象数据类型的定义:一种向用例隐藏内部表示的数据类型,抽象数据类型中的实例变量是private的

1.2.3.5API,用例与实现

开发数据类型的步骤:

  1. 定义API:将使用和实现分离,实现模块化编程.
  2. 用一个Java类实现API的定义
  3. 实现多个测试用例来验证

1.2.5.6字符串表示的习惯

一个对象的数据类型如果没有实现toString()方法,则会调用Object的默认实现,返回一个含有该对象内存地址的字符串,无实用价值,一般都需重新实现

1.2.5.9内存管理*

原始数据类型:内存管理对于原始数据类型比较容易,因为内存分配所需的信息在便一阶段就能够获取,Java会在声明变量时为它们预留内存空间,并在离开作用域后释放空间
对象:系统会在创建一个对象是分配内存,Java具有自动内存管理,可将无用的对象内存释放回内存池(垃圾回收)

1.2.5.10不可变性*

Java通过final强制保证不可变性,但final只能保证原始数据类型的实例变量不可变,对于引用类型的实例变量,该实例变量的值(某个对象的引用)无法改变,但对象的值本身仍可以改变

答疑
  1. 区别原始数据类型和引用类型的原因?
    尽管Integer等封装类型可以转原始数据类型为引用类型,但原始数据类型接近低层,运行快速
  2. Java中的指针:
    指针可以看做机器地址,Java的引用被称为安全指针,保证每个引用指向对象并回收无用的对象
    3.Java实现引用和垃圾收集的细节?
    一种自然方式是指针(机器地址),另一种是句柄(指针的指针),前者访问数据速度快,后者更好实现垃圾回收