`

java关键字null

阅读更多

 

一、null是代表不确定的对象
 
Java中,null是一个关键字,用来标识一个不确定的对象。因此可以将null赋给引用类型变量,但不可以将null赋给基本类型变量。
 
比如:int a = null;是错误的。Ojbect o = null是正确的。
 
Java中,变量的适用都遵循一个原则,先定义,初始化,然后才可以使用。我们不能int a后,不给a指定值,就去打印a的值。这条对对于引用类型变量也是适用的。
 
有时候,我们定义一个引用类型变量,在刚开始的时候,无法给出一个确定的值,但是不指定值,程序可能会在try语句块中初始化值。这时候,我们下面使用变量的时候就会报错。这时候,可以先给变量指定一个null值,问题就解决了。例如:
 
        Connection conn = null;
        try {
            conn = DriverManager.getConnection("url", "user", "password");
        } catch (SQLException e) {
            e.printStackTrace();
        }
 
        String catalog = conn.getCatalog();
 
如果刚开始的时候不指定conn = null,则最后一句就会报错。
 
二、null本身不是对象,也不是Objcet的实例
 
null本身虽然能代表一个不确定的对象,但就null本身来说,它不是对象,也不知道什么类型,也不是java.lang.Object的实例。
可以做一个简单的例子:
 
        //null是对象吗? 属于Object类型吗?
        if (null instanceof java.lang.Object) {
            System.out.println("null属于java.lang.Object类型");
        } else {
            System.out.println("null不属于java.lang.Object类型");
        }
 
结果会输出:null不属于java.lang.Object类型
 
三、Java默认给变量赋值
 
在定义变量的时候,如果定义后没有给变量赋值,则Java在运行时会自动给变量赋值。赋值原则是整数类型int、byte、short、long的自动赋值为0,带小数点的float、double自动赋值为0.0,boolean的自动赋值为false,其他各供引用类型变量自动赋值为null。
这个具体可以通过调试来看。
 
四、容器类型与null
 
List:允许重复元素,可以加入任意多个null。
Set:不允许重复元素,最多可以加入一个null。
Map:Map的key最多可以加入一个null,value字段没有限制。
数组:基本类型数组,定义后,如果不给定初始值,则java运行时会自动给定值。引用类型数组,不给定初始值,则所有的元素值为null。
 
五、null的其他作用
 
1、判断一个引用类型数据是否null。 用==来判断。
2、释放内存,让一个非null的引用类型变量指向null。这样这个对象就不再被任何对象应用了。等待JVM垃圾回收机制去回收。
 
============================================
 

null""的区别

问题一:

null""的区别

String s=null;

string.trim()就会抛出为空的exception  

String s="";  

string.trim()就不会抛,为什么?

答:

NULL代表声明了一个空对象,根本就不是一个字符串。  

""代表声明了一个对象实例,这个对象实例的值是一个长度为0的空字符串。

 

NULL代表声明了一个空对象,对空对象做任何操作都不行的,除了===  

""是一个字符串了,只是这个字符串里面没有内容了

 

String s=null;只是定义了一个句柄,也就是说你有了个引用,但是这个引用未指乡任何内存空间  

String s="";这个引用已经指向了一块是空字符串的内存空间,是一个实际的东东了,所以你可以对它操作,而不用担心什么了

 

你说数字0和没有是不是一种概念啊??道理一样的

 

而且,null可以赋值给任何对象.""就不行了.

 

这里""NULL绝对是两个概念  

""代表一个字符串存在,它的值就是“”  

NULL代表字符串根本没有实际的值,你并不知道它是什么。。。

 

,我明白了,意思就是String   string   =   null   String   string;是一回事儿

 

null是空对象     ""是空字符串

String s=null;//null是未分配堆内存空间  

String   a;//分配了一个内存空间,没存入任何对象  

String   a="";//分配了一个内存空间,存了一个字符串对象

 

 

 

问题二:

String s;String s=null;String s="a";有什么区别?  

针对这三种情况,使用out.println(s);的时候,第一个会出现异常,第二个会输出null.第三个则会输出a.  

这是为什么呢?这三句声明语句,各自作了什么呢?

 

答:

第一个只是定义了一个String类型变量s,并没有给它赋初值,在Java中,默认在使用一个变量的时候必须赋予它初值(降低风险)。

第二个和第三个都定义了String类型变量s,并赋予它初值,只不过第二个赋予的值为null(空)罢了

 

主要要理解的是String s; s为一个引用~~它不是对象  

第一个是没有初始化的引用;  

第二个为空引用;

第三个是在字符串池里写入一个字符'a',然后用s指向它。

另外,  

String s="a"String s=new String("a");是有本质上的区别的  

前者是在字符串池里写入一个字符'a',然后用s指向它;

后者是在堆上创建一个内容为"a"的字符串对象。

String   str="aaa";                    //于栈上分配内存

String   str=new   String("aaa");      //于堆上分配内存

 

String s; 系统会自动赋值null

 

String s;只是给s分配一个内存空间  

String s=null;是分配的空间中存储的值为空值  

String s="a";这句就不用我多说了分配的空间的值为字符a

 

 

 

问题三:

声明了一个string a;变量   

在以后的判断中,a==""a==null有何不同?  

 

答:

如果没有给a赋过值,a==""会导致异常。    

在实际处理时,往往认为""null代表相同的含义,即都代表无值。  

此时建议用如下语法:  

if(a==null   ||   a=="")  

{  

}  

如果anull,就不会执行后面的判断,直接返回true  

 

null是用来判断引用类型是否分配了存储空间  

""是针对字符串的;  

string类型实际上是字符串指针,也即是一个引用类型  

所以如果没有给a赋过值,a==""会导致异常  

所以if(a==null   ||   a==""){}这种写法也是正确的

 

 

问题四:

String abc=null;String abc="";String abc;三种写法有什么区别?

 

答:

1:创建一个空字符串对象,  

2:创建一个字符串为空的字符串对象。  

3:声明一个字符串对象,但并没有分配内存,而12已经分配了内存  

对于最后一种表示,你不能if(abc==null),或者int   length   =   abc.length();编译的时候会提示可能没有初始化.

 

 

String   abc=null;  

String   abc="";  

一般推荐使用第二种  

第一种abc指向null,很多时候要判断字符串是否为空时,容易漏掉这种情况,在调用String的相关方法的时候就会出错  

第二种则相对简单,String的方法都可以用,判断的时候也不会出错

 

1) String   abc=null;  

2) String   abc;   

3String   a="";  

4) String   b="";  

5) String   c=new String("");  

6) String   d=new String("");

//1)等于2),和C语言不同,JAVA为安全原因不允许一个悬挂引用,没有赋值的引用地址一律自动赋值为NULL,以防止访问到任意内存  

//3)4),变量ab将会指向同一内存地址(""的地址)  

//5)6)中,变量cd不会指向同一地址,而是两个""内容的地址,并且和a,b不同,实际上,3)4)相当于new String("").intern().  

//String类维护着一个字符串池,对于像3)4)这样的赋值方法,String会在这个池中查找字符串是否已经在池中,如果在,就直接指向该地址,

 

如果不在,生成一个实例放入池中再指向那个地址,可见对于同样内容的字符串多次引用时3)4)的方法要比5)6)的方法剩内存,之所以这样做,

 

因为String是一个内容不可变的量,运用的是设计模式GOF.FlyWeight  

 

 

 

 

但有个关键的一点,没有人说到,这就是:  

String s;在什么情况下可以等同于String s=null;而在什么情况下又不等同?!

考虑下面的代码:  

//StringTest.java  

public   class   StringTest   {     

    static   String   s;     //*  

    public   static   void   main(String[]   args)   {  

        //String   s;         //**  

        System.out.println(s);  

    }  

}    

编译并运行上面的代码,将打印null

可见标有*号的行是自动初始化了的(s被自动初始化为null)  

而如果把标有**号的行取消注释,代码将不能通过编译,这是因为这行定义的是本地变量,而本地变量是不会自动初始化的。

由此得出结论:

在成员变量的定义中,String s;等同于String s=null;

而在本地变量(方法变量)的定义中,String s;不等同于String s=null;,这时要使用s必须显式地赋值。

这些虽然是小知识点,但在实际应用中很重要,也很容易被一些人忽视,特此提出。

还有一点要说明的是:

只要是在方法在中定义变量都要显示赋初值,main()方法也不例外,而在方法之外编译器回自动赋初值。

 

 

分享到:
评论

相关推荐

    深入Java关键字null

    ### 深入Java关键字null #### 一、null代表不确定的对象 在Java语言中,`null`是一个非常重要的关键字,用于表示一个未确定的对象引用。这意味着你可以将`null`赋给任何引用类型变量,而不能将其赋给基本类型变量...

    java关键字总结文档

    ### Java关键字总结 Java是一种广泛使用的面向对象编程语言,它具备简单性、可移植性、高性能等特点。在Java中,关键字具有特殊的语法含义,不能用作标识符(例如变量名或方法名)。以下是对给定文件中提到的Java...

    Java关键字分类解释

    ### Java关键字分类解释 #### 一、类与接口定义关键字 - **class**: 在Java中,`class`关键字用于声明一个类。类是面向对象编程的基本单元,它定义了一组属性(成员变量)和方法(成员函数),这些共同构成了一个...

    Java关键字详细解

    这篇文档《Java关键字详细解》将深入探讨Java中的关键字及其用途。 首先,我们来看看Java中的主要关键字。`public`、`private`、`protected`是访问修饰符,用于控制类、方法和变量的访问权限。`public`可以被任何...

    JAVA关键字列表

    JAVA关键字列表 Java是一种面向对象的编程语言,具有多种关键字,用于控制程序的执行、定义变量、类和方法等。本文档系统列举了Java的关键字及其用法分类,总共分为以下几个类别:访问控制、类、变量修饰符、流程...

    Java关键字

    Java关键字是编程的基础,它们是Java语言预定义的标识符,具有特殊含义并被Java编译器识别。在Java中,一共有51个关键字(包括保留字),但描述中提到的是48个,可能是因为某些关键字在特定上下文不常用或者被归类到...

    java关键字大全及解释

    下面是对Java关键字的详细解释: 1. `abstract`: 用于定义抽象类或抽象方法,表示类或方法没有具体实现,需要子类进行具体实现。 2. `boolean`: 表示逻辑值,只有两个可能的值,`true` 和 `false`。 3. `break`: ...

    java关键字,适合新手的ppt

    对于新手来说,理解Java的关键字是非常重要的一步,因为它们构成了语言的基础并指导了代码的结构和行为。 Java的关键字是被语言本身保留的词汇,它们有特定的含义和功能。例如,`byte`, `short`, `int`, `long`, `...

    java关键字和java命名规范.pdf

    Java关键字和命名规范是Java编程语言中的基础概念,它们对于编写清晰、规范的代码至关重要。Java关键字是Java语言内置的、具有特殊用途的保留字,而命名规范则是关于如何给类、方法、变量等命名的约定。 ### Java...

    java实现根据关键字查找所在文件夹的文件

    在Java编程语言中,实现根据关键字查找文件夹内包含该关键字的文件是一项常见的任务,尤其在数据处理、日志分析或者文件管理系统中。这个功能可以帮助用户快速定位到含有特定信息的文件,提高工作效率。以下是一个...

    JAVA关键字总结(整理后最全最详细)

    下面是对Java关键字的详细总结,按照给出的部分内容进行排列: 1. `abstract`: - `abstract` 关键字用于声明抽象类或抽象方法。抽象类不能被实例化,只能作为其他类的基类。抽象方法没有具体的实现,必须在子类中...

    Java关键字解析.pdf

    Java关键字在编程中起着至关重要的作用,它们是语言预定义的标识符,具有特定的含义,不能用于命名变量、方法、类、包或参数。本文将深入解析几个关键的Java关键字及其用法。 首先,`instanceof`关键字用于判断一个...

    Java关键字英文解释

    以下是一些重要的Java关键字及其详细解释: 1. **public**: 这是一个访问修饰符,表示公开的或公共的。它允许任何类在任何包中访问被`public`修饰的类、属性或方法。例如: ```java public class Student { ...

    java关键字及作用

    ### Java关键字及作用详解 #### 总览 Java是一种广泛使用的面向对象编程语言,拥有丰富的关键字来帮助开发者构建高效、安全的应用程序。本篇详细介绍了Java中的关键字及其用途,覆盖了从访问控制到异常处理等多个...

    java关键字.pdf

    Java关键字是Java语言中预先定义的、具有特殊意义的单词,它们在Java程序中有着特殊的用途,比如用来声明数据类型、定义流程控制语句等。根据提供的部分内容,可以将Java的关键字分类并阐述它们的作用。 1. 访问...

    Java关键字及其作用

    JAVA 关键字及其作用 Java 是一种面向对象的编程语言,其语法中包含了一系列的关键字,这些关键字在程序中有着特殊的意义,用于控制程序的行为和结构。了解并掌握这些关键字对于编写高质量的Java代码至关重要。 一...

    java关键字.docx

    Java 关键字是编程语言的基础元素,它们在 Java 语法中具有特定的含义和作用,帮助程序员构建程序的结构和逻辑。以下是对标题和描述中提及的一些 Java 关键字的详细解释: 1. `import`:这个关键字用于引入外部类库...

    java关键字和标识符的使用

    Java 关键字和标识符的使用 Java 编程语言中,关键字和标识符是两个非常重要的概念,它们在编程中扮演着不同的角色。关键字是 Java 语言中预定义的单词,它们具有特殊的含义和用途,而标识符则是开发者自行定义的...

    【IT十八掌徐培成】Java基础第02天-01.java关键字.zip

    本教程"【IT十八掌徐培成】Java基础第02天-01.java关键字"深入讲解了Java的关键字及其用途。 Java的关键字主要分为以下几类: 1. 数据类型关键字:`byte`, `short`, `int`, `long`, `float`, `double`, `char`, `...

    Java关键字Transient与串行化

    在Java编程语言中,`transient`关键字与对象的序列化(serialization)机制密切相关,它在处理对象状态的持久化时扮演着关键角色。本文将深入探讨`transient`关键字的功能、用途以及它如何影响Java对象的序列化过程。 ...

Global site tag (gtag.js) - Google Analytics