面向对象程序设计(三)
来源:互联网 发布: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 了
- 面向对象程序设计(三)
- java面向对象程序设计(三)
- java 面向对象程序设计浅谈三
- 面向对象程序设计的三大特征
- LUA面向对象程序设计(三)多态
- 《JavaScript高级程序设计》读书笔记(三):面向对象
- java基础系列之三:java的面向对象程序设计
- 用C语言实现面向对象程序设计(三)
- 面向对象的程序设计( OOP )三大特性:
- Python篇----面向对象程序设计(三)(继承篇)
- java 实验三 面向对象程序设计(无脑实验系列)
- 面向对象程序设计Java-三大特征和设计思想
- C++面向对象程序设计
- 面向对象程序设计
- 面向对象程序设计总结
- 面向对象程序设计概念
- 面向对象的程序设计
- 面向对象程序设计
- 汇编指令速查
- 转载:从一个局长使用BS系统的无奈看测试点
- 翻硬币小趣题
- 利用java内存映射文件机制实现CRC循环冗余校验
- 备忘
- 面向对象程序设计(三)
- sql java 批处理
- Linux常用命令
- window弹出窗口-父子-模态
- ASP.NET2.0 GridView小技巧
- linux系统概述
- Apache启动报错 mbstring.dll 模块
- 多媒体中的[音频处理技术和基础知识大全]乐器数字接口MIDI的概念
- WCF编写规范