[关闭]
@XQF 2017-02-15T21:24:04.000000Z 字数 1086 阅读 1119

Java中的不可变类与解除引用

java


1.简述

不可变类就是说的要是对象一开始就被定义后是不能去修改他的成员变量的值的。

还有一个特殊的类叫做final类,。,哈哈,这种类与不可变类要进行区分,这种类主要是不能被继承,比如String类和StringBuffer类

2.有哪些不可变类?

所有基本类的包装类,还有就是String类。

3.如何自定义一个不可变类?

总体思想很明确,就是使用构造方法对属性(成员变量)一步到位,关闭与外界交流的所有关口。

4.自定义实例:

错误实例

  1. class T {
  2. private Date d;
  3. public T(Date d) {
  4. this.d = d;
  5. }
  6. public void setDate(Date d) {
  7. this.d = d;
  8. }
  9. public void print() {
  10. System.out.println(d);
  11. }
  12. }
  13. public class Test {
  14. public static void main(String[] args) {
  15. Date d = new Date();
  16. T t = new T(d);
  17. t.print();
  18. d.setMonth(5);
  19. t.setDate(d);
  20. t.print();
  21. }
  22. }

Wed Feb 15 21:16:41 CST 2017
Thu Jun 15 21:16:41 CST 2017
在这里面Date成员变量可变,最主要的是我们留了外界的接口

这样的类T就可以算是一种比较符合规矩的类了

  1. class T {
  2. private Date d;
  3. public T(Date d) {
  4. this.d = d;
  5. }
  6. public void print() {
  7. System.out.println(d);
  8. }
  9. }

再来个比较麻烦的

  1. class T {
  2. private Date d;
  3. public T(Date d) {
  4. this.d = (Date) d.clone();//解除引用
  5. }
  6. public void print() {
  7. System.out.println(d);
  8. }
  9. public Date getDate() {
  10. return (Date) this.d.clone();//解除引用
  11. }
  12. }
  13. public class Test {
  14. public static void main(String[] args) {
  15. Date d = new Date();
  16. T t = new T(d);
  17. t.print();
  18. d.setMonth(5);
  19. t.print();
  20. }
  21. }

输出结果:

Wed Feb 15 21:21:38 CST 2017
Wed Feb 15 21:21:38 CST 2017
说明改动没有起到效果,也说明我们的保护起到了作用,最重要的还学了一招解除引用

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注