一.数据类型
正如老师所说,编程比作写文章的时候,数据就是里面的名词。但我觉得这么比喻有点儿不充分,我觉得文章本身就是一种数据类型,尤其像JAVA面向对象来说,把数据,操作,代码绑定的十分紧密。在现实生活中很难找到一个概念与现在我们要探讨的数据相区分,不如说这个概念就是现实世界本身。
我们定义数据类型就是一组值和其上能进行的操作。
而变量就是空间,可存储满足约束的值。
JAVA类型包括基本类型和引用类型两种
基本类型 | 引用类型 |
---|---|
Stack | Heap |
不可变 | 可变,不可变 |
有值 | 有值有ID |
价格低 | 价格昂贵 |
基本类型允许使用包装类包装为对象类型。
二.静态/动态检查
静态检查:发生在编译阶段,编译器推断类型。
是“类型”检查
其中,调用方法名错误,参数,返回值类型错误,语法错误,都是静态类型检查。
动态检查:发生在运行阶段。
是“值”检查
其中,除零错,数组越界都是动态检查。
静态检查更能避免BUG把BUG留在编译阶段。
四.可变与不可变
可变与不可变是使用数据类型时类型的属性。
也是我们设计ADT时的设计决策。
1.可变类型允许修改值。
2.不可变类型一旦创建不允许修改。
注意改变变量与改变变量的值是不同的。
我是这么理解的.我们的对象变量是new出来的,而引用只是一个指向。
改变变量是改变了引用,而我new出来的对象没有变。
改变变量的值就是改变我new的对象。
而基本类型不可变int a = 1;
这个1才是我的数据,我不能把1变成2但我可以把a指向2.
final关键字
final表示我的一种设计决策
final引用:不可改变的引用,虽然我们不能改变对象的引用,但是我们仍旧可以改变属性。
集合类同理
final类:不可派生的类
final方法:不可override的方法。
典型的不可变对象string
String a = new String("a");
String b=a;
a = a.concat("b");
System.out.println(a); //ab
System.out.println(b); //a
a的方法创建一个新对象
而StringBuilder就是一个可变
StringBuilder a = new StringBuilder ("a");
StringBuilder b=a;
a = a.concat("b");
System.out.println(a); //ab
System.out.println(b); //ab
五.为什么要区分可变与不可变
可变的优点:
1.不用创建大量拷贝,节约空间。
2.性能更好
3,共享数据
不可变优点:
安全和其他的性能
可变类型给出数据有表示泄露的危险,客户端可以轻易修改你的数据。
防范:防御拷贝,对于所有给出内部可变类型的方法,给出一份副本。
不如直接用不可变类型。
六,代码快照
反映了运行某一时刻的各变量或对象的状态以及变化情况; 其中箭头代表引用, 由变量名指向引用地址.
用单箭头表示可变引用,用双箭头表示不可变引用,
用单椭圆表示可变对象,用双椭圆表示不可变对象,