第三章 ADT与OOP——数据类型基础

1.基本数据类型与对象数据类型

基本数据类型(primitive types):

int、 long、boolean、 double、 char……

对象数据类型(object types):

Integer、Long、Boolean、Double、String、StringBuilder……

Java约定中,基本数据类型是以小写字母开头,而对象类型以大写字母开头。

下图很好的说明了二者的区别:

boxed primitives:将基本类型包装为对象类型,例如Boolean, Integer, Short, Long, Character, Float, Double。通常是在定义集合类型的时候使用它们。一般情况下,尽量避免使用。一般可以自动转换。


2.静态类型检查与动态类型检查

静态类型检查 static checking:在程序运行之前检查发现bug。在编译阶段发现错误,避免了将错误带入运行阶段,可提高程序的正确性与健壮性。其主要检查目标包括:

  • 语法错误(Syntax errors)
  • 类名/方法名错误(Wrong names)
  • 参数数目错误(Wrong number of arguments)
  • 参数类型错误(Wrong argument types)
  • 返回值类型错误 (Wrong return types)


动态类型检查 Dynamic checking:在程序运行中检查发现bug。其主要检查目标包括:

  • 非法的参数值 (Illegal argument values)
  • 非法的返回值 (Unrepresentable return values)
  • 越界 (Out-of-range indexes)
  • 空指针 (Calling a method on a null object reference)


此外还有一种无检查:这种不会帮助使用者查找bug,需要亲自检查错误。

显然静态类型检查要优于动态类型检查要优于无检查。

静态检查与动态检查对比:静态检查是关于“类型的检查”,不考虑值,而动态检查是关于“值”的检查。


3.值的改变与引用

首先先来讨论一个问题,改变一个变量与改变一个变量的值有何区别?

  • 改变一个变量:将该变量指向另一个值的存储空间
  • 改变一个变量的值:将该变量指向的存储空间写入一个新的值


4.Mutability与Immutability


Immutability不变性:

对于immutable类型的变量,一旦被创建出来其值不能被改变。如果是引用类型,一旦确定其指向的对象也不能在改变。

对于这种变量可以用final关键词修饰,注意如果编译器无法确定final变量不会改变,就会提示错误,这是静态检查的一部分。实际编程中应尽量使用final变量作为方法的输入参数、作为局部变量。其代表了程序员的一种设计决策。

注意:

  • final类无法派生子类
  • final变量无法改变值与引用
  • final方法无法被子类重写


需要注意的是:String类型是immutable类型,而StringBuilder才是mutable类型

二者快照图(snapshot diagram)对比:



此时看没有区别,但当引用变多时就会出现不一样的结果,例如:


另外使用immutable类型时如果频繁修改会产生大量的临时拷贝,GC(垃圾回收,第八章会详细说明)负担就重了。此时最好用mutable类型。

关于immutable与mutable数据类型区别:immutable类型更安全,而mutable类型则在其他质量指标上表现更好,实际使用选择应该具体情况。


5.防御式拷贝

当类中的一个方法返回了一个可变的成员变量时,而且不希望其被用户修改时,可以采用防御式拷贝的策略进行编程。

方法较为简单,现只给出一个简单的示例:

存在风险代码:


这里说明一下,因为返回的是Date数据类型为mutable类型,所以如果客户端得到这个类型变量并修改了它,会导致period类内部数据修改,这是一个很严重的表示泄漏(后面会详细说明)。mutable类与immutable类如果是有C/C++基础的会感觉很奇怪,稍微唠叨一下。mutable类进行传参的时候类似于C/C++指针传参,对其进行修改会对源数据进行修改。java并没有指针这项内容,取而代之的就是mutable与immutable。

进行防御式拷贝后:



6.快照图(Snapshot diagram)

Snapshot 是一个code-level, run-time, and moment view。用于描述程序运行时的内部状态 ,好处是用于描述程序运行时的内部状态 ,便于刻画各类变量随时间变化 ,便于解释设计思路

具体使用方法:



若对象是不可变对象用双线椭圆:


当值改变时:



不可变引用:用双线箭头。


注意:此时引用是不可变的,但是指向的值是可变的,可变的引用,也可指向不可变的值。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值