引用(String例)

引用类型的值有两种含义:引用所指对象的内存地址和引用所指对象的内容。
String str = null;
表示的是 str 所指对象的内存地址为 null;
String str = "Test";
表示的是 str 所指对象的内存地址是一个字符串对象的地址,并且这个字符串对象的toString方法返回"Test"。

// 例1
String str = null;
System.out.println(str);

例1打印时,JVM发现str所指对象的内存地址为null,JVM针对此类引用直接返回字符串"null"。
所以你看到的是 null 。

// 例2
String str = null;
System.out.println(str.toString());

例2打印时,JVM将调用str所指对象的toString()方法,但是str所指对象是null,所以JVM抛出NullPointException。
所以你看到的是抛出 NullPointException 异常。

// 例3
String str = null;
String str2 = "Test";
System.out.println(str + str2);

当out.println参数中含有+时,JVM内部使用了StringBuilder的append方法。也就是说:
例3可以分解为

String str = null;
String str2 = "Test";
StringBuilder sb = new StringBuilder();
sb.append(str);
sb.append(str2);
System.out.println(sb.toString());

所以你会看到 nullTest 的结果。

// 例4 引申(JVM如何进行 + - * / 等简单运算,自己思考吧。)
int i = 10;
int j = 20;
String str = null;
System.out.println(i + j + str);

例4会打印出什么呢?
例4可以分解为

int i = 10;
int j = 20;
String str = null;
StringBuilder sb = new StringBuilder();
int c = i + j;
sb.append(c);
sb.append(str);
System.out.println(sb.toString());

时间: 2024-10-05 10:27:23

引用(String例)的相关文章

iOS 单例(Singleton)总结 和第三库引用单例

引用:http://blog.csdn.net/lovefqing/article/details/8516536#t3 http://blog.csdn.net/kindazrael/article/details/7917863 单例模式用于当一个类只能有一个实例的时候, 通常情况下这个“单例”代表的是某一个物理设备比如打印机,或是某种不可以有多个实例同时存在的虚拟资源或是系统属性比如一个程序的某个引擎或是数据.最简单的一个例子是,当用户打开QQ空间播放音乐的时候,这里就是一个单例,如果不是

从String s = new String("abc")了解引用变量与对象

一.引用变量与对象的区别 首先,根据我们实例bean对象过程知道,A aa;仅是声明了一个类A的引用变量,aa并不是一个对象,类的对象是通过 new来创建的. 所以,String s ....中s并不是一个对象,而是一个string类型的引用变量. 另外, 对于string字符串来讲,字符串文字本身是一个对象,如 "XXX",则 XXX就是一个对象. 二.文字池即缓冲池(pool of literal strings)和堆(heap)中的字符串对象 由于字符串对象的大量使用(一般而言对

使用软引用和弱引用防止内存溢出

下面以使用软引用为例来详细说明.弱引用的使用方式与软引用是类似的. 假设我们的应用会用到大量的默认图片,比如应用中有默认的头像,默认游戏图标等等,这些图片很多地方会用到.如果每次都去读取图片,由于读取文件需要硬件操作,速度较慢,会导致性能较低.所以我们考虑将图片缓存起来,需要的时候直接从内存中读取.但是,由于图片占用内存空间比较大,缓存很多图片需要很多的内存,就可能比较容易发生OutOfMemory异常.这时,我们可以考虑使用软引用技术来避免这个问题发生. 首先定义一个HashMap,保存软引用

第二十四章 C++11特性之右值引用

右值引用,是 C++11 语言核心中最为重要的改进之一.右值引用给 C++ 带来了“Move语义”(“转移语义”),同时解决了模板编程中完美转发的问题(Perfect forwarding).右值引用使 C++ 对象有能力甄别什么是(可以看作)临时对象,对于临时对象的拷贝可以做某种特别的处理,一般来说主要是直接传递资源的所有权而不是像一般地进行拷贝,这就是所谓的 move 语义了.完美转发则是指在模板编程的时候,各层级函数参数传递时不会丢失参数的“属性”(lvalue/rvalue, const

【JAVA中String、StringBuffer、StringBuilder类的使用】

一.String类概述 1.String对象一旦创建就不能改变. 2.字符串常量池. 字符串常量池的特点:池中有则直接使用,池中没有则创建新的字符串常量. 例1: 1 public class StringDemo 2 { 3 public static void main(String args[]) 4 { 5 StringDemo1(); 6 7 } 8 public static void StringDemo1() 9 { 10 String str1="abcd"; 11

Android学习笔记_78_ Android开发中使用软引用和弱引用防止内存溢出

在<Effective Java 2nd Edition>中,第6条"消除过期的对象引用"提到,虽然Java有 垃圾回收机制,但是只要是自己管理的内存,就应该警惕内存泄露的问题,例如的对象池.缓存中的过期对象都有可能引发内存泄露的问题.书中还提到可以用 WeakHashMap来作为缓存的容器可以有效解决这一问题.之前也确实遇到过类似问题,但是没有接触过"弱引用"相关的问题,于是查阅了一些资料. <Java 理论与实践: 用弱引用堵住内存泄漏>

java String中的intern()

1 Java会确保一个字符串常量只有一个拷贝. 例1:String s0=”kvill”;  String s1=”kvill”;  String s2=”kv” + “ill”;  System.out.println( s0==s1 );  System.out.println( s0==s2 );  结果为:  true  true  因为例子中的s0和s1中的”kvill”都是字符串常量,它们在编译期就被确定了,所以s0==s1为true:而”kv”和”ill”也都是字符 串常量,当一个

优化—使用软引用和弱引用

Java从JDK1.2版本开始,就把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用. 这里重点介绍一下软引用和弱引用. 1.如果一个对象只具有软引用,内存够,就不回收,内存不够,就回收.只要垃圾回收器没有回收它,该对象就可以被程序使用.软引用可用来实现内存敏感的高速缓存. 2.如果一个对象只具有弱引用,碰见就回收.不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象. 共同点:软引用和弱

java ——String , StringBuffer, StringBuilder类

一.String类概述 1.String对象一旦创建就不能改变. 2.字符串常量池. 字符串常量池的特点:池中有则直接使用,池中没有则创建新的字符串常量. 例1: “==”  比较两个对象是否引用同一实例 public class StringDemo { public static void main(String args[]) { StringDemo1(); } public static void StringDemo1() { String str1="abcd"; Str