印象笔记转过来总是出现奇奇怪怪的格式问题……所以截图过来了;文字在下面(未转格式)
Chapter4 数据类型与类型检验1.编程语言中的数据类型类型和变量
*
类型:一组值,和值上可执行的操作;
*
变量:存储一个特定类型值的命名的地址;
java的数据类型
*
基本数据类型,int,long,boolean,double,char;
*
对象数据类型,String,BigInteger;
*
根据java惯例,基本数据类型小写,对象数据类型首字母大写;
对比:注意分配位置,结合上面一条惯例——首字母大写的变量对象数据类型堆上分配;
对象类型形成层次结构
*
由继承关系形成层次结构,子类型指向超类型;
*
一个类,是它的所有超类的实例(继承也是创建实例)
*
从超类继承可见区域和方法(public,protected);
*
可以重写方法来改变行为;
2.静态 vs 动态 数据类型检查
静态vs动态类型
*
java是静态类型语言
*
所有变量的类型在编译时就已知,因此编译器可以推导所有表达式的类型;
*
e.g. 如果a,b都是int,则表达式a+b也是int;
*
IDE在写代码时就检查类型,所以写代码时就会报错;
*
动态类型的语言在runtime检查类型,比如python;
静态检查&动态检查
*
一种语言可提供三种自动检测:
*
静态类型检查;
*
动态类型检查
*
无检查;
*
优先级&好的程度:静态>动态>无
静态检测(类型、形式)
*
语法错误
*
类名/函数名错误
*
参数数目错误
*
参数类型错误
*
返回值类型错误
动态检测(具体值)
*
非法的参数值,比如检查除数是否为0;
*
非法的返回值,比如不能用返回值类型表示的值(字符串返回类型的函数返回数字之类);
*
越界;
*
空指针;
总之——静态检查,关于【类型】的检查,不考虑值;动态检查,关于【值】的检查;3.可变性和不可变性
赋值操作
*
使用“=”
*
int a; a=1;
*
可以声明&赋值:
*
int a=1;
改变一个变量 或 它的值
*
二者区别:
*
改变一个变量:该变量指向另一个值的存储空间(改变引用指向);
*
改变一个变量的值:将变量当前指向的值的存储空间中写入一个新值(改变指向的值);
*
变化是【必要之恶】;
*
尽可能避免变化;
不变性 immutability
*
重要设计原则
*
不变数据类型Immutable types,一旦被创建,其值不能被改变;
*
如果是引用类型也可以是不变的;一旦确定指向的对象就不能再被改变(和C++一样)
*
让引用不可变,使用关键字final声明,等同于C系列的const;
*
如果编译器无法确定final变量不改变,会提示错误(静态检查)
*
所以尽量使用final变量作为参数、局部变量;
*
note:
*
final类不能派生子类;
*
final变量不能改变值/引用(前面说的change的两种类型都不能=不能做改变!)
*
final方法不能被子类重写(override)
*
不变对象:一旦被创建,始终指向同一个值/引用;可变对象:可使用方法改变自己的值/引用;
String是一个不变对象类型
StringBuilder是一个可变对象类型
*
多个引用指向同一个地址时,体现不同:
两种类型的优缺点
*
不变类型安全,但修改不变类型会进行大量的内存分配和回收,性能开销大;
*
可变类型性能更好但不安全;
防御式拷贝:
*
返回一个对象的拷贝;
*
不可变类型不需要防御式拷贝;
4.内存快照图
描述程序运行时的内部状态
快照图中基本类型和对象类型的值
*
基本类型的值:箭头指向值,代表一个引用;
*
对象类型值:
*
用一个带有类型名字的圈圈表示;
*
可以写出对象的值域,圈里写变量名,指向圈外它们的对应值;
*
可变对象,单线圈;
*
不可变对象,双线圈:
*
可变引用:单线箭头;
*
不可变引用:双线箭头;