【重走Android之路】【番外篇】有关于null的一些知识点
1、首先,到底什么是null?
String a = null;
Object b = null;
System.out.println(a instanceof String);// false
System.out.println(b instanceof Object);// false
2、那么,为什么要使用null?
// 在栈内存中创建一个引用变量b;
// 在堆内存中申请空间存储“Use Memory”字符串;
// 把字符串的堆内存地址赋给变量b
String b = new String("Use Memory"); // 只在栈内存中创建一个引用变量a
String a = null;
【注3】在不必立马指定对象实例的前提下,使用null可以尽可能节省空间。
// 声明对象并开辟空间保存User对象的值
User user = new User(1, "张三", 23); // ... 经过一番处理后不再使用 // 此时把user对象置为null,会告知JVM该对象不再被使用,可以进行回收
// JVM在必要的时机会把user对象对应的空间回收
user = null;
【注4】在确定对象不再使用的时候,使用null可以及时告知JVM等待回收的资源
3、一个关于null的调用困惑
/*
**********************************************************
*** ***
*** Copyright(C) 2014 Miao-Nodin. All rights reserved. ***
*** ***
*** Author: Miao-Nodin ***
*** ***
*** This is a source file of a part of a huge project. ***
*** Firstly, you must thank a pretty princess named ***
*** Lady喵~喵~ for bestowing on you this honour that ge ***
*** -ts this file. Who is she? She is my student. ***
*** ***
**********************************************************
*/
package com.miao.base; /**
* @Created: 2014年5月28日 by Miao-Nodin
* @Description: 演示使用null访问对象方法
*
* @Version:1.0
* @Update:
*
*/
public class Null {
private static final int LEVEL_ONE = 1;
private static final int LEVEL_TWO = 2;
private static final int LEVEL_THREE = 3; private static void say(int level) {
switch (level) {
case LEVEL_ONE:
System.out.println("请你放尊重点,不要碰我!");
break;
case LEVEL_TWO:
System.out.println("你再这样我要生气了!!!");
break;
case LEVEL_THREE:
System.out.println("讨厌了啦~~~臭流氓~~~");
break;
}
} public static void main(String[] args) {
Null x = null;
x.say(x.LEVEL_ONE); //正常输出
((Null) x).say(x.LEVEL_TWO); //正常输出
((Null) null).say(x.LEVEL_THREE); //正常输出
}
}
输出结果:
你再这样我要生气了!!!
讨厌了啦~~~臭流氓~~~
null)相当于Null x = (Null) null; 如此便和第一种一致。
4、null的字符串相加困惑
/*
**********************************************************
*** ***
*** Copyright(C) 2014 Miao-Nodin. All rights reserved. ***
*** ***
*** Author: Miao-Nodin ***
*** ***
*** This is a source file of a part of a huge project. ***
*** Firstly, you must thank a pretty princess named ***
*** Lady喵~喵~ for bestowing on you this honour that ge ***
*** -ts this file. Who is she? She is my student. ***
*** ***
**********************************************************
*/
package com.miao.base; /**
* @Created: 2014年6月4日 by Miao-Nodin
* @Description:演示null作为String类型空对象时的'+'操作
*
* @Version:1.0
* @Update:
*
*/
public class NullPlus { public static void plus() {
String a = null;
String b = null;
String c = a + b;
if("nullnull".equals(c)){
System.out.println("This String-Object is not null.");
}
} /**
* @param args
*/
public static void main(String[] args) {
plus();
}
}
/**
* @see java.lang.String#valueOf(java.lang.Object)
* @see #append(java.lang.String)
*/
public StringBuilder append(Object obj) {
return append(String. valueOf (obj));
}
public StringBuilder append(String str) {
super.append (str);
return this ;
}
看得出,问题在String.valueOf(obj),null通过这个方法被转化为了"null",然后才有"nullnull"这种奇怪的问题。
public static void plus();
Code:
Stack=3, Locals=3, Args_size=0
0: aconst_null
1: astore_0
2: aconst_null
3: astore_1
4: new #15; //class java/lang/StringBuilder
7: dup
8: aload_0
9: invokestatic #17; //Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
12: invokespecial #23; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
15: aload_1
16: invokevirtual #26; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
19: invokevirtual #30; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
22: astore_2
23: ldc #34; //String nullnull
25: aload_2
26: invokevirtual #36; //Method java/lang/String.equals:(Ljava/lang/Object;)Z
29: ifeq 40
32: getstatic #40; //Field java/lang/System.out:Ljava/io/PrintStream;
35: ldc #46; //String This String-Object is not null.
37: invokevirtual #48; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
40: return
LineNumberTable:
line 28: 0
line 29: 2
line 30: 4
line 31: 23
line 32: 32
line 34: 40 LocalVariableTable:
Start Length Slot Name Signature
2 39 0 a Ljava/lang/String;
4 37 1 b Ljava/lang/String;
23 18 2 c Ljava/lang/String; StackMapTable: number_of_entries = 1
frame_type = 254 /* append */
offset_delta = 40
locals = [ class java/lang/String, class java/lang/String, class java/lang/String ]
另外,从上述字节码中也可以看出:源码中三行声明语句在Stack中一共创建了三个引用。至于创建了几个实例,请自行分析。
【重走Android之路】【番外篇】有关于null的一些知识点的更多相关文章
- 【重走Android之路】【番外篇】关于==和equals
[重走Android之路][番外篇]关于==和equals 在实际的编程当中,经常会使用==和equals来判断变量是否相同.但是这两种比较方式也常常让人搞得云里雾里摸不着头脑.下面是我个人做的总 ...
- 【重走Android之路】【路线篇(二)】知识点归纳
[重走Android之路][路线篇(二)]知识点归纳 参考:http://blog.csdn.net/xujing81/article/details/7313507 第一阶段:Java面向对 ...
- 【重走Android之路】【Java面向对象基础(二)】细说String、StringBuffer和StringBuilder
[重走Android之路][基础篇(二)][Java面向对象基础]细说String.StringBuffer和StringBuilder 1.String String是Java中的一个final ...
- 【重走Android之路】【Java面向对象基础(三)】面向对象思想
[重走Android之路][基础篇(三)][Java面向对象基础]面向对象思想 1 面向对象的WWH 1.1 What--什么是面向对象 首先,要理解“对象”.在Thinkin ...
- 【重走Android之路】【Java面向对象基础(一)】数据类型与运算符
[重走Android之路][基础篇(一)][Java面向对象基础]数据类型与运算符 1.数据类型介绍 在Java中,数据类型分为两种:基本数据类型和引用类型. 基本数据类型共8种,见下表: 基本数 ...
- 【重走Android之路】【开篇】序
[重走Android之路][开篇] [序] 本人Nodin,偶尔也叫MoNodin,朋友们都喜欢叫我丁,还有个笔名叫陌上幽人,文艺时叫恋风,发奋时叫不肯腐烂的土壤...也许你觉得我 ...
- Python之路番外:PYTHON基本数据类型和小知识点
Python之路番外:PYTHON基本数据类型和小知识点 一.基础小知识点 1.如果一行代码过长,可以用续行符 \换行书写 例子 if (signal == "red") and ...
- 【重走Android之路】【路线篇(一)】路线图
总结归纳了J2SE和Android的知识点,自己制订了一套详细的路线图,其中肯定有考虑不全和不合适的地方,欢迎各位大牛批评指正. 详细路线图如下:
- Apache Cordova开发Android应用程序——番外篇
很多天之前就安装了visual studio community 2015,今天闲着么事想试一下Apache Cordova,用它来开发跨平台App.在这之前需要配置N多东西,这里找到了一篇MS官方文 ...
随机推荐
- JSON WEB TOKENS
用JWT来保护我们的ASP.NET Core Web API 在上一篇博客中,自己动手写了一个Middleware来处理API的授权验证,现在就采用另外一种方式来处理这个授权验证的问题,毕竟现在也 ...
- 软件工程课堂练习——N层电梯只停一层求乘客爬楼层数最少(基本方法+优化方法)
题目: •石家庄铁道大学基础大楼一共有四部电梯,每层都有人上下,电梯在每层都停.信1201-1班的张一东觉得在每层都停觉得不耐烦. •由于楼层不太高,在上下课高峰期时时,电梯从一层上行,但只允许停在某 ...
- Log4j2 配置笔记(Eclipse+maven+SpringMVC)
Log4j2相关介绍可以百度看下,这里只注重配置Log4j2 能够马上跑起来: 1.pom.xml文件中添加Log4j2的相关Maven配置信息 <!-- log4j2 --> <d ...
- python 数据结构-集合set
原文地址:http://docs.pythontab.com/python/python3.4/datastructures.html#tut-tuples 集合是一个无序不重复元素的集. 基本功能包 ...
- SQL Server 动态管理视图(DMVs)
DMV在本地部署的SQL Server中需要VIEW SERVER STATE的权限 和事务有关的DMV sys.dm_tran_active_transactions:返回与您的当前逻辑数据库的 ...
- 第五周&第六周
学习进度表 周数 专业学习目标 学习时间 新增代码行 博客发表量 人文方面学习 知识总结 第四周 认真掌握老师上课所讲的内容,在课外多学习一些知识 5小时 50 1 阅读 ...
- bzoj 1196 二分+生成树判定
我们先二分一个答案,对于每个答案,先加一级公路,如果不够k直接break, 然后再加二级公路,加的过程类似Kruskal. /************************************* ...
- bzoj 1024 暴力深搜
我们直接暴力的深搜怎么切就行了, 每一刀切的方案只有横着和竖着,横竖又分在几等分点切, 因为要保证每个人的面积相同,所以比较好处理了,第几个几等分点就 分给这边几刀. /*************** ...
- 【BZOJ】【3238】【AHOI2013】diff(差异)
题目链接:www.lydsy.com/JudgeOnline/problem.php?id=3238 后缀数组 这题题面给的暗示性就很强啊……一看就是要用后缀xx一家的算法,由于本蒻只会后缀数组所以就 ...
- shadowmap 及优化
对于子阴影的走样, 条纹 开zbias resterizeState zbias = 1000...大概这样 另一个方法是画背面 backface是指一个人肚子那面,后背那面 而不是肚子的里面那层 所 ...