面向对象程序设计(三)

来源:互联网 发布:js调用php函数 编辑:程序博客网 时间:2024/06/10 03:53

      在程序中, 我们经常会  方法名(new 类名().方法());  这样 new 类名() 出来的其实也是一个 对象,

但是和 类名 对象名 = new 类名() 这样的创建出来的对象就是不一样啊?

      哪里不一样呢?  new 类名() 创建出来的是一个 匿名对象, 他没有被栈内存中的任何名称所指向,

这种匿名对象只能够使用一次的.

 

      这种匿名对象 我们通常就是在 将一个对象作为实参传入一个方法中去. 他通常只是在堆内存中开辟了一片空间, 而且这种对象通常就是作为方法的参数而出现的.

 

      String 是一个类 我们使用的时候有两种方式, (1) .String object1 = new String("zero");  

(2) String str1 = "zero"; 

       第一种方式呢: 是首先在堆内存中开辟了一片区域  将"zero" 这个字符串存入进去, 并同时被栈内存中的 object1 (句柄) 所指向, 然后因为 new String() 的关系 就又在堆内存中开辟了一片区域,放置这个对象,这样的话其中就有一个事垃圾空间了.

 

     String str1 = "zero"; 则是只在堆内存中开辟了一片空间, 存储了 "zero" 这个字符串而已, 然后被str1所指向.

 

     String 与 匿名对象

 

        "zero".equals(对象名) 这里就可以看出来,  "zero" 这样的一个字符串就是一个匿名对象了.

 

     

看这么一段, 输出的结果就是 true  , 这说明什么呢?

      说明 name1 和 name2 的内存地址是一样的.  这是为什么呢?

这里就是说到了 java的共享设计模式 .  在java中 , 当一个 赋值和 前面刚刚覆过的值 是一样的, 就不会在创建一个再在 堆内存中创建一个空间, 而是直接指向了那个已有的字符串的堆内存空间.

 

      String 中的内容一旦声明就不能改变 . 这句话是怎么体现的呢?

      这样的话 就看的很清了, 当 String name1= "123" 的时候, 就是在栈内存中声明了一个空间 name1 ,然后在堆内存中 存在一片空间,值为 123 , 被 name1 所指向.

      fun(name1)的时候, 就是把name1 的指向同时也给了str2 ,  str2 也指向了堆内存中的"123", 然后在fun() 中, str2 被赋予了 "space" , 这在内存中就表现为, 又在堆内存中增加了一个字符串 "space" , 因为"space"是要赋给str2 的 ,但是str2 原来又是指向 "123"的, 这时 就把str2到 "123"的指向破坏了,

转而指向了 "space" .

      System.out.println(name1) 输出显示的name1 的值,在内存空间中, name1 还是指向的 "123" , 自始至终都没有变过 , 输出显示的肯定就还是  123 了

      

原创粉丝点击