引用数据类型的概念_引用数据类型有哪几种

电子常识

2611人已加入

描述

  引用类型 由类型的实际值引用(类似于指针)表示的数据类型。如果为某个变量分配一个引用类型,则该变量将引用(或“指向”)原始值。不创建任何副本。引用类型包括类、接口、委托和装箱值类型。

  引用数据类型的概念

  “引用”(reference)是c++的一种新的变量类型,是对C的一个重要补充。它的作用是为变量起一个别名。假如有一个变量a,想给它起一个别名,可以这样写:

  int a;int &b=a;

  这就表明了b是a的“引用”,即a的别名。经过这样的声明,使用a或b的作用相同,都代表同一变量。在上述引用中,&是“引用声明符”,并不代表地址。

  不要理解为“把a的值赋给b的地址”。引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址。声明引用并不开辟内存单元,b和a都代表同一变量单元。

  注意:在声明引用变量类型时,必须同时使之初始化,即声明它代表哪一变量。在声明一个变量的引用之后,在本函数执行期间,该引用一直与其代表的变量相联系

  引用数据类型有哪几种

  Java提供了两类数据类型:一种是基本类型(原始类型),一种是引用类型。

  接口

  接口

  注意:

  1、在基本数据类型中,除了boolean类型所占长度与平台有关外,其他数据类型长度都是与平台无关的。比如,int永远占4个字节(1 Byte = 8 bit)。

  2、void不是基本数据类型

  在 Java 中基本类型只有八种,详见 Java Language Specification 的 4.2 节:

  http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2

  另外,在 Java Language Specificaion 的第 14.8 节也提及 void 并不是一种类型:

  http://java.sun.com/docs/books/jls/third_edition/html/statements.html#5989

  为什么《Thinking in Java》等一些书籍都说,void是基本类型的一种呢?

  来看void的包装类java.lang.Void源码:

  package java.lang;

  /**

  * The Void class is an uninstantiable placeholder class to hold a

  * reference to the Class object representing the Java keyword

  * void.

  *

  * 翻译:Void类是一个不可重复的占位符类,

  * 用于保存对表示Java关键字void的Class对象的引用

  **/

  public final class Void { //final表明这个类是不允许被其他类继承

  /**

  * The Class object representing the pseudo-type corresponding to

  * the keyword void.

  * 翻译:Class对象表示对应于关键字void的伪类型。

  */

  public static final Class《Void》 TYPE = Class.getPrimitiveClass(“void”);

  /*

  * The Void class cannot be instantiated.

  * 翻译:Void类不能被实例化。

  */

  private Void() {}

  }

  1234567891011121314151617181920212223242526

  再看getPrimitiveClass()方法的源码:

  /*

  * Return the Virtual Machine‘s Class object for the named

  * primitive type.

  * 翻译:返回指定基本类型的虚拟机的Class对象。

  */

  static native Class getPrimitiveClass(String name);123456

  “Ctrl+Alt+H”查看调用getPrimitiveClass()方法的所有类,确实是“Byte、Boolean、Short、Character、Integer、Long、Float、Double、Void”一共9个包装类,由此猜测把void也归到基本数据类型的说法可能来源于此。

  3、基本数据类型的默认值仅在作为类中属性时生效

  在方法内部必须先对基本数据类型变量赋值后才能使用,否则编译不通过。Demo如下:

  public class DefaultValueTest {

  static int intA;

  static boolean blnA;

  public static void main(String[] args) {

  int intB;

  boolean blnB;

  System.out.println(intA); //输出0

  System.out.println(blnA); //输出false

  //System.out.println(intB); //编译不通过

  //System.out.println(blnB); //编译不通过

  }

  }12345678910111213

  在程序中如果某些数据可能会返回空值,那么用包装类比较好。比如当结果为空时,转换为int会发生异常,而转换为Integer则不会,因为对象可以为null。此时建议用包装类,虽然会牺牲一些转换效率,但可以避免持久化数据时产生的一些异常。

  - 引用数据类型

  引用类型(reference type)指向一个对象,不是原始值,指向对象的变量是引用变量。

  在java里面除去基本数据类型的其它类型都是引用数据类型,自己定义的class类都是引用类型,可以像基本类型一样使用。

  引用类型常见的有:String,StringBuffer,ArrayList,HashSet,HashMap等。

  String也属于引用数据类型:

  String a = “china”;

  String b =a; // 则a、b都指向常量池的“china”。

  String a = new String(“china”);

  String b =a; //则a、b都指向堆中的“china”。

  String a = new String(“china”);

  String b =a;

  a = a.substring(0,1); //则b指向栈中的“china”,a指向新的对象“c”。12345678

  如果要对比两个对象是否相同,则需要使用equals()方法,但有一点需要注意:equals()方法的默认行为是比较引用。如果是你自己写的类,你应该为它重写equals()来比较对象的内容。大多数Java类库都实现了比较对象内容的equals()方法。

  - 两种类型对比

  最后,基本数据类型和引用数据类型的一些对比如下:

  接口

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分