zoukankan      html  css  js  c++  java
  • Java对象声明时:new与null的区别

    作者:林子云
    链接:https://www.zhihu.com/question/21468505/answer/18333632
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    首先要明白,java里对象传递的时候,传递的都是引用(也就是对象的地址),这比传递整个对象高效的多。而基础类型,int,double等传递的才是值。
    比如,(new ArrayList<String>).add(new String("hello")),jvm只是把new String("hello")的地址存入到了列表list里面。String str = new String("Test"),是开辟内存放入了对象,并把它的引用赋给str。

    同理,BookInfo bookinfo=null与BookInfo bookinfo=new BookInfo():前者,是声明了一个对象(的引用),jvm并没有开辟内存放入一个对象;而后者,在声明了一个对象的引用后,又把新开辟的没有存储任何有效值的对象的地址赋给了他。bookinfo=test.getinfo(),又把它指向了另一个地址 = = 也就是说原来开辟的内存并没有用,那就没有意义。但是java虚拟机自动垃圾回收机制会判断并回收内存的。。不用想太多。
    你完全可以写成:
    ArrayList<BookInfo> InfoList=new ArrayList<BookInfo>();
    BookInfo bookinfo=infoList.getInfo()。

    综上:如果你的类在创建后,要自己读写数据,那就必须初始化;如果像Bookinfo那样,完全是为了从其他地方接收引用,也完全可以省了new吧。

    如果是在类的成员变量中,BookInfo bookinfo;和BookInfo bookinfo=null;是一样的效果;因为该类在初始化时成员变量也会做初始化,默认就是null;而方法内的变量则不会初始化;

    而如果是在方法的成员变量,则必须初始化,也就是=null或者new,因为为了保证java的安全性;

  • 相关阅读:
    Quickuse.Ioc 快速应用.依赖注入组件
    Quickuse.Utility 快速应用.基础组件
    对System.ComponentModel.DataAnnotations 的学习应用
    C# List 转 Tree 公共方法
    C# 用Redis实现的分布式锁
    使用DbTableColumnWeb项目简要
    Application_Error VS OnException 遇到的坑
    在使用Intelligencia.UrlRewriter过程中 中文乱码问题
    C# MVC 页面静态化导致的问题
    关于.NetCore与.Netframework 对于DataSet的序列化与反序列化问题的探讨.
  • 原文地址:https://www.cnblogs.com/LingCoder/p/Java.html
Copyright © 2011-2022 走看看