java中的null

     一.null的概念

     首先,null是java中的关键字,大小写敏感;

     int类型默认值为0,boolean类型默认值为false,null是任何引用类型的默认值

     null既不是变量,也不是类型,也不是java.lang.Object的实例,它是种特殊的值;你既可以将它赋给任何引用类型,也可以将它转化为任何引用类型;

     如果使用了带有null值的引用类型变量,instanceof操作将会返回false。

     二.使用null

     判断一个引用类型是否为null,一定用“==”来判断

     对一个引用型变量赋值null,如果只有一个引用型变量指向这个对象,则这个操作会让这个原本指向的对象无法被使用,使之等待虚拟机去回收;

     null用来判断引用变量是否分配了空间;

     在成员变量中,string s,将自动赋初值为null;

     在方法变量中,string s则不会这样,必须显式赋初值

     三.null与“”的区别

     null是什么都没有,一个引用变量指向null,表示指向空,而“”表示内容为空,根本差别是null没有地址,没有分配内存,而“”有地址,分配了内存,只是没有内容;

     你不能对一个值为null的引用对象进行任何操作,而“”是一个实例,有自己的对象空间。

     null表示还没new出对象,就是还没开辟空间,指向的对象没有空间,是空的,而“”表示new出了对象,但是这个对象装的是空字符串。

      一般推荐使用String s=“”;来初始化字符串变量

     string a=null;//赋初值为null,a为空引用

     string b;//没赋初值,使用时会报错,b为没有初始化的引用,分配了内存空间,但是没有存入任何对象

     string c=“”;//分配了内存空间,存储了一个字符串对象,在栈上;

     string d=new String(“123”);//在堆上分配空间

     四.顺便说说String

     String a=“”;

     String b=“”;

     a和b将指向同一个内存地址,即“”的内存地址;

     String类维护着一个字符串池,像上面的赋值语句,会让StString在字符串池中寻找是否它已经在字符串池中,如果在,将引用变量指向该块内存;如果不在,生成一个实例        放入字符串池中,并指向它

     String a=new String(“”);

     String b=new String(“”);

     此时,a和b指向不同的地址,堆上;

     五.容器与null

      List:允许重复元素,可以加入任意多个null。
      Set:不允许重复元素,最多可以加入一个null。
      Map:Map的key最多可以加入一个null,value字段没有限制。
      数组:基本类型数组,定义后,如果不给定初始值,则java运行时会自动给定值。引用类型数组,不给定初始值,则所有的元素值为null。

import java.util.HashMap;
import java.util.Map;
 
/**
 * An example of Autoboxing and NullPointerExcpetion
 * 
 * @author WINDOWS 8
 */
public class Test {
    public static void main(String args[]) throws InterruptedException {
      Map numberAndCount = new HashMap<>();
      int[] numbers = {3, 5, 7,9, 11, 13, 17, 19, 2, 3, 5, 33, 12, 5};
 
      for(int i : numbers){
         int count = numberAndCount.get(i);
         numberAndCount.put(i, count++); // NullPointerException here
      }       
    }
}

代码想做的是找到一个数字在此数组中出现了多少次,这是Java数组中典型的寻找重复的技术。首先得到以前的数值,然后再加一,最后把值放回Map里。程序员可能会以为,调用put方法时,自动装箱会自己处理好将int装箱成Interger,但是他忘记了 当一个数字没有计数值的时候,HashMap的get()方法将会返回null,而不是0,因为Integer的默认值是null而不是0。当把null值传递给一个int型变量的时候自动装箱将会返回空指针异常。
六.易出现的错误
调用非静态方法来使用一个值为null的引用类型变量,将会抛出空指针异常,但是可以使用静态方法来使用一个值为null的引用类型变量。因为静态方法使用静态绑定,不会抛出空指针异常。
public class Testing {             
   public static void main(String args[]){
      Testing myObject = null;
      myObject.iAmStaticMethod();
      myObject.iAmNonStaticMethod();                             
   }
 
   private static void iAmStaticMethod(){
        System.out.println("I am static method, can be called by null reference");
   }
 
   private void iAmNonStaticMethod(){
       System.out.println("I am NON static method, don't date to call me by null");
   }
输出:
I am static method, can be called by null reference
Exception in thread "main" java.lang.NullPointerException
                at Testing.main(Testing.java:11)

     后两小节内容参考以下两篇文章:http://lavasoft.blog.51cto.com/62575/79243/和http://www.importnew.com/14229.html

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值