• 选学校
  • 高中毕后选择什么学校好
  • 启蒙星
  • 北大青鸟课程介绍
  • 北大青鸟助你走上高级软件工程师修炼之路
  • 转行不是梦,学北大青鸟IT培训
  • 北大青鸟辉煌12年
  • 株洲北大青鸟校区升级

您现在的位置:株洲北大青鸟 >> >> 师资力量>> 技术天地

师资力量
开班信息
输入姓名手机号码预约试听课程
姓  名:*
手机号:*
创业摇篮班
开班日期:10月15日
招生人数:25
就业直通班
开班日期:10月31日
招生人数:25
就业精英班
开班日期:9月13日
招生人数:已满
技术天地
  • Java基础:引用类型和原始类型的区分
  • 发表日期:2009/7/19 14:52:40 阅读数:771  
  •  
  •             Java基础:引用类型和原始类型的区分

                                                        株洲北大青鸟  叶盛

    Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。另外,Java还为每个原始类型提供了封装类(Wrapper)。如果需要一个整型变量,是使用基本的 int 型呢,还是使用 Integer 类的一个对象呢?如果需要声明一个布尔类型,是使用基本的 boolean,还是使用 Boolean 类的一个对象呢?本文可帮助您作出决定。
      下表列出了原始类型以及它们的对象封装类。
      原始类型 封装类
      =================
      
    boolean Boolean
      
    char Character
      
    byte Byte
      
    short Short
      
    int Integer
      
    long Long
      
    float Float
      double Double
    引用类型和原始类型的行为完全不同,并且它们具有不同的语义。例如,假定一个方法中有两个局部变量,一个变量为 int 原始类型,另一个变量是对一个 Integer 对象的对象引用:
     

    int i = 5; // 原始类型
      Integer j = new Integer(10); // 对象引用
     
     

      这两个变量都
    存储在局部变量表中,并且都是在 Java 操作数堆栈中操作的,但对它们的表示却完全不同。(本文中以下部分将用通用术语堆栈代替操作数堆栈或局部变量表。)原始类型 int 和对象引用各占堆栈的 32 位。(要表示一个 int 或一个对象引用,Java 虚拟机实现至少需要使用 32 位存储。)Integer 对象的堆栈项并不是对象本身,而是一个对象引用。
      Java 中的所有对象都要通过对象引用访问。对象引用是指向对象存储所在堆中的某个区域的指针。当声明一个原始类型时,就为类型本身声明了存储。前面的两行代码表示如下:
      引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。
      许多程序的代码将同时包含原始类型以及它们的对象封装。当检查它们是否相等时,同时使用这两种类型并了解它们如何正确相互作用和共存将成为问题。程序员必须了解这两种类型是如何工作和相互作用的,以避免代码出错。
    例如,不能对原始类型调用方法,但可以对对象调用方法:
     

    int j = 5;
      j.hashCode(); // 错误

      //...
      
    Integer i = new Integer(5);
      i.hashCode(); // 正确
     
     

    使用原始类型无须调用 new,也无须创建对象。这节省了时间和空间。混合使用原始类型和对象也可能导致与赋值有关的意外结果。看起来没有错误的代码可能无法完成您希望做的工作。
     
     

    例如:
     
    import java.awt.Point;
      
    class Assign
      {
       public static void main(String args[])
       {
        int a = 1;
        int b = 2;
        Point x = new Point(0,0);
        Point y = new Point(1,1); //1
        System.out.println("a is " + a);
        System.out.println("b is " + b);
        System.out.println("x is " + x);
        System.out.println("y is " + y);
        System.out.println("Performing assignment and " +
        "setLocation...");
        a = b;
     
      a++;
        x = y; //2
        x.setLocation(5,5); //3
        System.out.println("a is "+a);
        System.out.println("b is "+b);
        System.out.println("x is "+x);
        System.out.println("y is "+y);
       }
      }
     
      这段代码生成以下输出:
      a is 1
      
    b is 2
      
    x is java.awt.Point[x=0,y=0]
      
    y is java.awt.Point[x=1,y=1]
      
    Performing assignment and setLocation...
      
    a is 3
      
    b is 2
      
    x is java.awt.Point[x=5,y=5]
      y is java.awt.Point[x=5,y=5]
      修改整数 a b 的结果没什么意外的地方。b 的值被赋予整型变量 a,结果 a 的值增加了 1。这一输出反映了我们希望发生的情况。但是,令人感到意外的,是在赋值并调用 setLocation之后 x y 对象的输出。我们在完成 x = y 赋值之后特意对 x 调用了 setLocationx y 的值怎么会相同呢?我们毕竟将 y 赋予 x,然后更改了 x,这与我们对整数 a b 进行的操作没什么不同。
      这种混淆是由原始类型和对象的使用造成的。赋值对这两种类型所起的作用没什么不同。但它可能看起来所有不同。赋值使等号 (=) 左边的值等于右边的值。这一点对于原始类型(如前面的 int a b)是显而易见的。对于非原始类型(如 Point 对象),赋值修改的是对象引用,而不是对象本身。因此,在语句
      x = y;
      之后,x 等于 y。换句话说,因为 x y 是对象引用,它们现在引用同一个对象。因此,对 x 所作的任何更改也会更改 y。下面是 //1 处的代码执行以后的情况:
      执行 //2 处的赋值以后情况如下:
      当在 //3 处调用 setLocation 时,这一方法是对 x 引用的对象执行的。因为 x 引用的 Point 对象也正是 y 所引用的对象,所以我们现在得到以下结果:
      因为 x y 引用同一个对象,所以对 x 执行的所有方法与对 y 执行的方法都作用于同一个对象。
      区分引用类型和原始类型并理解引用的语义是很重要的。若做不到这一点,则会使编写的代码无法完成预定工作。
上一篇:[PHP]十天攻坚PHP之第一天
下一篇:JAVA设计模式中的单例模式
分享到:

版权所有 ©株洲健坤科技职业培训学校    学校地址:株洲市天元区黄山路205号健坤大厦(天元区消防中队对面)

咨询报名热线:400-8812-866    邮箱地址:4008812866@b.qq.com   备案号: 湘ICP备10202015号  

北大青鸟学费是多少 湖南北大青鸟怎么样
株洲北大青鸟好不好 株洲北大青鸟学费多少 株洲北大青鸟学校这么样
秒速时时彩走势