抽象数据类型概念澄清

一 关于toString()方法

Java中的所有数据类型都会继承toString()方法来返回String表示的该类型的值。但该方法的默认实现并不实用,它会返回用字符串表示的该数据类型值的内存地址,因此我们常常会提供实现来重载默认实现,并在API上加上toString()方法。此类方法的例子还包括equals()、compareTo()和hashCode()。

二 对象的三大重要特性

1 状态:数据类型中的值。

2 标识:能够将一个对象区别与另外一个对象,可以认为对象的标识就是它在内存中的地址。

3 行为:数据类型的操作。

三 关于构造函数

构造函数没有返回值,因为它总是返回它的数据类型对象的引用。每当调用了new(),系统都会:

  • 为新的对象分配内存空间。

  • 调用构造函数初始化对象中的值。

  • 返回该对象的一个引用。

四 关于引用对象

对于引用类型,复制的是引用,而非实际的值。改变一个对象的状态将会影响到所有和该对象的别名有关的代码。我们习惯认为两个不同的基础数据类似的变量是独立的,但这种感觉对于引用类型的变量并不使用。

每当使用引用类型作为参数时我们创建的都是别名,所以必须小心。

五 关于数组

数组也是对象。

当将数组传递给一个方法或是将数组变量放在赋值语句的右侧时,我们都在创建该数组引用的一个副本,而非数组的本身。对于一般情况,这种效果正合适,因为我们期望方法能够重新安排数组的条目并修改数组的内容。

创建一个对象的数组需要以下两个步骤:

1 使用方括号语法调用数组的构造函数创建数组。

2 对于每个数组元素,调用它的构造函数创建相应的对象。

六 字符串表示习惯

如果一个对象的数据类型没有实现toString()方法,那么转换会调用Object的默认实现。默认实现一般都没有多大的实用价值,因为它只会返回一个含有该对象内存地址的字符串。因此我们通常会为我们每个类实现并重写默认的toString()方法。

七 包装类型

当一个int值需要和一个String连接时,它的类型会被转换为Integer并触发toString()方法。

八 内存管理

下面三行代码

Date a = new Date(12,31,1999);
Date b = new Date(1,2,2011);
a=b;

在第三行赋值语句之后,不仅a和b会指向同一个Date对象(1/1/2011),而且不存在能够引用初始化变量a的那个Date对象的引用了。本来该对象的唯一引用就是变量a,但是该引用被赋值语句覆盖了,这样的对象被称为孤儿。对象在离开作用域之后也会变成孤儿。

编程语言和系统需要某种机制在必要时为数据类型的值分配内存,而在不需要时释放它们的内存(对于一个对象来说,有时是在它变成孤儿之后)。

Java最重要的一个特性就是自动内存管理。它通过记录孤儿对象并将它们的内存释放到内存池中将程序员从管理内存的责任中解放出来。这种回收内存的方式叫做垃圾回收。

九 不可变性

不可变数据类型,例如Date,指的是该类型的对象中的中值在创建之后就无法再被改变。与此相反,可变数据类型,例如Counter或Accumulator,能够操作并改变对象中的值。Java语言通过final修饰符来强制保证不可变性。

String对象是不可变的,因为我们一般不希望String的值发生改变,而Java数组是可变的,因为我们一般希望改变数组中的值。但也存在我们希望使用可变的字符串(这就是Java的StringBuilder类)和不可变数组(这就是Vector类)。

final非常不幸地只能用来保证原始数据类型的实例变量的不可变性,而无法用于引用类型的变量。例如下面示例:

public class AlgorithmFAQ {
    public static void main( String[] args ) {
        int index = -1;
        assert index >= 0:"Negative index in main";
    }
}

任何数据类型的设计都需要考虑到不可用性,而且数据类型是否是不可变的则应该在API中说明,这样使用者才能知道该对象中的值是否无法改变。

九 契约式设计

异常:一般用于处理不受我们控制的不可预见的错误。

断言:验证我们在代码中做出的一些假设。

十 异常与错误

异常和错误都是程序在运行过程中出现的破坏性事件。Java采取的行动称为抛出异常或是抛出错误。

一种叫做快速出错的常规编程实践提倡,一旦出错就立刻抛出异常,使定位出错位置更容易,它和忽略错误并将异常推迟到以后处理的方式相反。

十一 断言

断言是一条需要在程序的某处确认为true的布尔表达式。如果表达式的值为false,程序将会终止并报告一条出错信息。我们使用断言来确保程序的正确性并记录我们的意图。

下面是断言的示例:

public class AlgorithmFAQ {
    public static void main( String[] args ) {
        int index = -1;
        assert index >= 0:"Negative index in main";
    }
}

默认设置是没有启动断言的,可以在命令行下使用-enableasserttions标志(简称-ea)启动断言。断言的作用是调试,程序的正常操作不应该依赖断言。

下面是启用断言的方法:

下面是启用断言后的测试结果:

Exception in thread "main" java.lang.AssertionError: Negative index in main
	at AlgorithmFAQ.AlgorithmFAQ.main(AlgorithmFAQ.java:13)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值