精华内容
下载资源
问答
  • 对象和对象的引用

    千次阅读 多人点赞 2018-06-02 01:41:28
    最近初学java对于对象和对象的引用以及实例化有诸多迷惑,查了很多博客和API,现整理自己的理解如下:Java是一种面向对象的语言,采用类和对象的概念。Java中每个对象都有一种类型,即对象所属的类。类有两个主要...

    最近初学java对于对象和对象的引用以及实例化有诸多迷惑,查了很多博客和API,现整理自己的理解如下:

    Java是一种面向对象的语言,采用类和对象的概念。Java中每个对象都有一种类型,即对象所属的类。类有两个主要成员:域(field)和方法(method)。

    1. 域是与一个类或该类的对象相关联的数据的变量。域中存储初值或执行类的方法得到的计算结果。
    2. 方法包含该类的可执行代码。方法由语句构成。方法被调用的方式,以及这些方法所包含的语句最终指导程序的执行。

    对象以及对象的引用

    关键字new用来创建对象。从一个类中创建用一个对象被称为实例化,所以,对象也常被称为实例。

    Java中新创建的对象被放在被称为“堆”的系统存储区中。Java中的对象都通过“对象引用”(object reference)来访问。一个类的变量持有一个对象,实际上是对该对象的引用。当变量不再引用任何对象时,该对象引用就为null。而我们说的把对象传给一个方法实际上是把对象的引用传给一个方法(参考C++中指针的概念)。但是多数情况下,对象和对象引用的区别都被大家忽略。而这又恰恰是理解对象的关键。

    现在这里有一个类:

    class Point{
        public static void main(String[] args){
        System.out.println("hello");
    }

    对于Point类我们创建对象的通常语句为:

    Point point=new Point();

    通常大家以为point即为所创建的类,其实并不是这样,实际上point是我们创建的对象的引用。这个语句可以分解为两部分来看:

    Point point;//①
    point=new Point();//②

    Point是这里自定义的一个类型,即类类型。

    在语句①中经由Point声明了一个类类型的变量point,是Point类引用变量,它存放在栈空间中。也就是用来指向Point的对象的对象引用。但是此时point不是任何对象的引用,其指向为null,因为对象要在语句②中才创建。

    在语句②中由关键字new创建了一个Point的对象,并将之存放在堆中,然后利用操作符“="使得point引用变量指向刚刚创建的在堆中的对象。

    对象本身看不见摸不着,它是堆中的一块内存实体,甚至说对象本身没有名字。Point不是对象,因为一个类可以创建n个对象不可能每一个都叫做Point,point也不是对象它是Point定义的一个变量,经由语句②它成为了对象的引用。有了对象的引用,就可以方便的调用方法等操作。

    对象和对象引用的关系

    ”但是此时point不是任何对象的引用,其指向为null“上一部分我们讲到对象的引用可以指向null。它真正的含义是:

    一个对象的引用可以:指向一个具体的已经创建的对象或者指向null。即对象的引用只有唯一的指向,不能同时指向多个对象,这一点也很好理解,借用指针的概念,一个指针某一时刻只能指向唯一的内存块代表唯一的内存地址。既然point这个引用变量可以被”赋值“操作,那么自然的如果Point类此时通过”point2=new Point();"又创建了一个新的对象2,我们可以有:

    point=point2;

    这样point就成了对象2的引用,对象1和对象2为堆中的不同的内存块。但是point2此时仍旧是对象2的引用,即对象2有两个引用变量指向它。如果把气球比作对象的话,系气球的绳子比作对象的引用,那么对象2这个气球上面系了两个绳子。显然最初创建的对象1上面没有任何绳子系在上面,也就是说它没有“对象引用”,对于这样的对象就要面临被废区收集器(garbage collection)自动回收,从而在堆中消除。但是并不是立即消除,系统会判断在一个合适的时候回收。

    总结起来:对象的引用某一时刻只可以有唯一指向(或null),对象本身可以同时被多个引用变量引用(或0个)。

    得不到



    展开全文
  • 什么是Java的对象引用? Java中都有哪些类型的对象引用? Java中提供Java对象引用主要有什么目的? 通过本文,你就能很清楚得了解Java的对象引用

    Java对象的引用

    一、概念,什么是Java对象的引用?
      每种编程语言都有自己的数据处理方式。有些时候,程序员必须注意将要处理的数据是什么类型。你是直接操纵元素,还是用某种基于特殊语法的间接表示(例如C/C++里的指针)来操作对象。所有这些在 Java 里都得到了简化,一切都被视为对象。因此,我们可采用一种统一的语法。尽管将一切都“看作”对象,但操纵的标识符实际是指向一个对象的“引用”(reference)。 对Java对象的引用,是描述的定义。 
      
    二、Java对象引用的目的
    Java中提供这四种引用类型主要有两个目的:
    第一是 可以让程序员通过代码的方式决定某些对象的生命周期
    第二是 有利于JVM进行垃圾回收

    三、四中Java对象的引用
    Java对象的引用包括:强引用,软引用,弱引用,虚引用
    强引用:是指创建一个对象并把这个对象赋给一个引用变量。
    软引用:如果一个对象具有软引用,内存空间足够,垃圾回收器就不会回收它;
    如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被 程序使用。软引用可用来实现内存敏感的高速缓存,比如网页缓存、图片缓存等。使用软引用能防止内存泄露,增强程序的健壮性。
    SoftReference的特点是它的一个实例保存对一个Java对象的软引用, 该软引用的存在不妨碍垃圾收集线程对该Java对象的回收。
    弱引用:WeakReference弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来表示。
    虚引用:虚引用(PhantomReference) 虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收 。

    要注意的是,虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会把这个虚引用加入到与之 关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

    展开全文
  • 刚刚接触Java时应该听说过一...对于对象的引用,心里大概知道,却不知怎么表达。还有一个问题就是Java是值传递还是引用传递,在C语言中这个问题看到的比较多,在Java中似乎没怎么探讨过。下面围绕上面两个问题来分析!

        刚刚接触Java时应该听说过一句“万物皆对象”,《Java编程思想》一书中也描述对象“将对象视为奇特的变量,它可以存储数据,除此之外,还可以要求它在自身上执行操作。理论上讲,可以抽象待求解问题的任何概念化构件,将其表示为程序中的对象”。对于对象的引用,心里大概知道,却不知怎么表达。还有一个问题就是Java是值传递还是引用传递,在C语言中这个问题看到的比较多,在Java中似乎没怎么探讨过。下面围绕上面两个问题来分析!

     

    *什么是对象引用?

        在C语言中指针是重点亦是难点,到现在还是觉得指针是一个高深的东西,因为它可以直接操作内存,简单地说,指针可以指向一个物理地址,然后操作这一块内存。在Java中的对象的引用和C、C++中的指针是比较像的,不过也只是比较像而已,有人觉得Java中的对象就是一个指针,但事实上,Java中的对象引用和C++中的引用在语法上更加接近,不过两者也存在很大差别。第一版的《Java编程思想》把Java中的对象引用叫做“句柄”,不过我们现在更习惯用“引用”。

         对于Java中的对象引用的解释可以用《Java编程思想》的一段话解释,“每种编程语言都有自己的数据处理方式,有些时候,程序员必须注意将这些要处理的数据是什么类型。你是直接操作元素,还是用某种基于特殊语法的间接表示(例如C/C++里的指针)来操作对象。所有这些在Java中得到了简化,一却都被视为对象。因此,我们可以采用一种统一的语法。尽管一切都被视为对象,但操作的标识符实际是指向一个对象的‘引用’ ”。

    再举一个这本书中有关对象个对象引用的例子:

        对象和对象引用就好比电视机和遥控器,对象是电视机,对象引用是遥控器,即遥控器用来控制电视机,遥控器和电视是关联起来的,我们要控制电视,只需要一个遥控器即可。若有String s; ,这里的s创建了一个字符串引用,就相当于有了一个遥控器,可是没有电视机,可是记得吗,还有万能遥控器,,不过在配对之前,万能遥控器是不与任何一台电视机相关联的,当配对成功之后它就与特定的电视机产生了管理,所以说这个s其实现在还是一个还没有指向任何字符串对象的字符串引用,当我们通过new的方式创建了一个字符串对象,其实就相当于给这个引用关联了一个对象,这个引用关联了一个对象,这个引用就指向了这个对象。

     

    弄清楚了Java中的引用,下面补充一段关于String和StringBuffer的例子:

    public static void main(String[] args) {
        String s1 = new String("hello String!");
        String s2 = s1;
        s2 = "你好 String!";
    
        StringBuffer s3 = new StringBuffer("hello");
        StringBuffer s4 = s3;
        s4.append(" StringBuffer!");
    
        System.out.println("s1: "+s1);   //s1: hello String!
        System.out.println("s2: "+s2);   //s2: 你好 String!
        System.out.println("s3: "+s3);   //s3: hello StringBuffer!
        System.out.println("s4: "+s4);   //s4: hello StringBuffer!
    }
    

    之前总结过:String一旦创建就不会再改变,上述代码中,之前s1和s2指向的是同一个对象,但是当是s2重新赋值的话,所指向的对象就变了,这点对于StringBuffer不同,因为它创建的字符串存在缓冲流,所以s3和s4一开始指向的是同一个对象,然后s4改变了这个对象,这个时候其实s3和s4指向的还是同一个对象,所以内容也是相同的。这里记住一个很重要的知识点——

        如果两个引用指向同一个对象,不管哪个引用去改变这个对象,其结果是对象的内容都会发生改变,而且只有一个对象,但是String是一个特例!

     

    *Java中是值传递还是还是引用传递?

        首先,答案是值传递,属于基础知识,却往往被我们忽视。对于Java中的传递方式必须要深刻理解什么是值,什么是引用,刚好上面我们分析了什么是对象的引用。下面还是来看一个例子:

    public static void main(String[] args) {
            String str = "hello";
            setString(str);
            System.out.println(str);  //hello
        }
        public static void setString(String str) {
            str = str + "String";
        }

        在这个例子中,不要被setString()方法中的str迷惑了,这个str和main方法中的str是不一样的,先不谈值传递和引用传递,我们知道String一旦创建是不可变的,所以这里的str是不会变的。实际上是setString()中的这个str指向了新创建的字符串对象“hello String”。

     

        对于Java中的传参我们可以分为基础类型和引用类型,但两者传参方式都是值传递,对于基础数据类型传参方式是值传递是比较好理解的,重点在于引用类型。还是一个例子:

    Integer a = new Integer(1);
    Integer b = a;
    b++ ;
    System.out.println("a="+a+"\t b="+b);  //a=1	 b=2

        这个例子再次说明Java的引用类型是值传递方式传参的,因为a的值没有随着b的改变同时改变。引用类型中的值传递中“值”指的是什么呢?这里的值其实就是引用所存储的对象的地址值,其实b是a的一个复制品,这个b是独立存在的一个引用,在没有将a复制给它的时候,她还是一个空引用,谁也不指向,但是当a复制给它后,就相当于b存储了和a一样的地址,都指向同一个对象,如图1,但是一旦b自增就相当于Integer b = new Integer(2);,就变成了图2,即b引用的地址就变了。

          所以Java中传参的方式只有一种,那就是值传递,另外,我们知道对于引用都是存在栈中的,而实际的对象是存在堆中的,栈中的引用存放了可以指向实际对象的地址,而引用数据类型的传参,传的就是这个地址!

     

    展开全文
  • 对象的引用和对象的指针 (常指针与常引用)const 左定值,右定向,修饰不变参

    常指针与常引用

    对象的引用和对象的指针

    为了说明对象指针与对象引用的相关知识,我们来看一下下面的例子

    在这个类中,我们定义了两个数据成员(一个横坐标一个纵坐标),另外,还定义了一个构造函数,还有三个成员函数,其中printInfo()函数是一个常成员函数。那么在实现的时候,也需要在printInfo函数后面加上const关键字来修饰,如下:

    下面我们来看看对象的引用和对象的指针如何来定以。

    当我们实例化一个对象coor1的时候,我们就可以给这个对象coor1起一个别名叫做coor2(也就是定义一个引用,引用的名字叫做coor2),当从coor2去调用printInfo()的时候,也会打印出coor1的坐标(3, 5)来。同理,当我们去定义一个对象的指针pCoor,如果让它去指向coor1的话,那么使用pCoor去调用printInfo()的时候,也会打印出coor1的坐标(3, 5)。这里需要提醒大家的是,如果我们定义的是对象的引用,我们就可以直接就用那个对象赋值给这个引用;但是当我们定义的是对象指针的时候,我们在给这个指针赋值的时候,一定特别注意给这个对象前面要加上取地址(&)符号,这样才能正确的赋值。说完了对象引用和对象指针后,如果我们在定义的时候,在前面加上const修饰符,这就变成了对象的常引用和常指针了。

    对象的常引用和常指针

    在这个例子当中,我们定义了一个对象的常引用和对象的常指针,当用coor1去调用printInfo()的时候,肯定不会有问题,会打印出coor1的坐标(3, 5)。关键是当我们用coor2去调用getX()的时候,因为getX这个时候还会传入一个this指针,而这个this指针就是coor2这样的this指针。请注意我们在定义getX和getY的时候,没有在其后面加const,也就是说getX和getY并不是一个常成员函数,这就意味着当用coor2去调用getX()的时候就会出现错误,而出现错误的原因就是因为此时coor2是一个常引用,作为常引用来说,它只有读权限,而getX这里的参数this是一个要求读/写权限的参数,所以其传入的时候就会出现编译错误。所以此时,coor2只能调用其常成员函数。同理使用pCoor来调用getY的时候也是错误的,因为pCoor此时是一个常指针(也只有只读权限)。

    下面继续看一个更为复杂的例子。

    在这个例子中,实例化了两个坐标对象coor1和coor2,然后又定义了一个对象指针,注意,这里定义的对象指针跟刚刚前面定以的有点不一样。之前const的位置是在Coordinate的前面,现在const放在了*的后面。如果放在*的后面,我们定义的这个pCoor一旦指向了一个对象,那么它就不能再指向另外的对象了。那么我们继续分析下面的三行代码,看看是不是正确。

    当pCoor去调用getY,而getY这里要求传入的是可读写权限的对象,而pCoor虽然用const修饰了,但是它的修饰位置是修饰的其本身(意味着这个指针不能指向其他对象),但是这个指针所指向的对象的内容本身是可变的,可见它是一个具有读写权限的指针,只限于它所指向的那个对象可读写,但是它却不能指向其他对象。所以这行代码是正确的。再看下面一行代码,pCoor去指向了coor2,这个就是不允许的(因为pCoor不可以再指向其他对象了),显然这里编译器就会报错。对于第三行代码,pCoor去调用printInfo,显然也是正确的,因为printInfo是一个常成员函数(常成员函数这里传入的this指针要求的是只读权限的),而此时的指针pCoor是具有可读写权限的,所以显然也是正确的。

    展开全文
  • 对象的引用和对象本身的区别: java中没有指针的概念,取而代之的是引用(这个和c++中的引用不是一个意思),这个引用是一个变量而已,存放在栈里面(你可以理解栈和堆是计算机存储器中的不同位置,但是都是用类...
  • python参数传递:对象的引用

    千次阅读 2018-06-08 10:04:56
    python参数传递:对象的引用         大家都知道在python中,一切皆对象,变量也不再具有类型,变量...
  • Java 中对象的引用的四种级别

    千次阅读 2016-07-14 10:44:28
    Java 中对象的引用的四种级别
  • c++返回函数局部对象的引用

    千次阅读 2015-05-25 14:58:15
    函数千万不要返回局部对象的引用或指针  局部变量在函数里面,当函数执行结束后将释放局部变量,如果返回引用或批针这个时候引用或指针指向所指向的内存空间已经释放。指针和引用将是垂悬指针。很危险! 但是如果...
  • java中,对象,还有所有的new出来的对象都是存放在堆里。  方法存放在方法体中。  基本类型的变量的数据和对象的引用存放在栈中  ...
  • List添加对象添加的是对象的引用

    千次阅读 2017-04-19 15:35:06
    对象引用
  • 将对象添加到List集合中添加的是对象的引用还是对象本身? 做了一下代码示例展示 public static void main(String[] args){ Map param=new HashMap(); List> aramList=new ArrayList(); for (int i=0;i;i++){
  • 看网上的介绍,对于字符串常量池中到底保存的是字符串对象,还是字符串对象的引用,众说纷纭… 看 jdk1.8 对 intern() 的说明. When the intern method is invoked, if the pool already contains a string equal to ...
  • EffectiveJava(6)消除过期对象的引用

    千次阅读 多人点赞 2017-02-24 19:21:58
    消除过期对象的引用过期引用 – 在操作集合类的时候,未清理过期的对象引用(即:过期引用),常会导致内存泄露.从而报outOfmemory错误. 1.过期对象导致内存泄漏. 2.一旦对象引用过期,清除这些引用 3.如果一个过期对象...
  • 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递 ...对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的.
  • python中从变量到对象的连接称作引用。也就是说,引用是一种关系,以内存中的指针的形式实现。具体而言:变量是一个系统表的元素,拥有指向对象的连接的空间。对象是分配的一块内存,有足够的空间去表示它们所代表的...
  • 在C++ primer书中有这么一句话,“千万别返回局部对象的引用”与“千万别返回局部对象的指针”,为什么会有这种说法呢?以下就为大家讲解一下: 1.返回局部对象的引用 string & opp(const string & name) {  ...
  • ARC下查看对象的引用计数

    万次阅读 2015-06-28 13:23:55
    网上各种文章、问答给出的结论都是“ARC下无法打印对象的引用计数值”。确实,ARC禁止直接查看Objective-C对象的引用计数,但是Objective-C对象不是还可以转化为Core Foundation对象么?于是动手做了一个小实验:id ...
  • java-对象的引用、对象的比较

    千次阅读 2017-06-03 18:48:34
    在java语言中尽管一切都可以看作对象,但真正操作标识符实质上是一个引用,那么引用究竟在java中是如何体现的呢? 语法如下: 类名 对象引用名称 ...注意:引用只是存放一个对象的内存地址,并非存放一
  • 当批量处理一些数据的时候,经常会将生成的对象放入集合中...因为集合中存放的是对象的引用,改变原来对象的属性,那么从集合中得到的对象属性也就变了。下面一个示例就是这个问题monitorCompanyRiskGradeTrend = new M
  • java中对象和对象的引用的区别

    千次阅读 2017-09-25 00:01:32
    尽管将一切都“看作”对象,但操纵的标识符实际是指向一个对象的引用”(reference)。”  这段话来自于《Java编程思想》,很显然,从这段话可以看出对象和对象引用不是一回事,是两个完全不同的概念。举个...
  • 如果对象的引用被置为null,只是断开了当前线程栈帧中对该对象的引用关系,而 垃圾收集器是运行在后台的线程,只有当用户线程运行到安全点(safe point)或者安全区域才会扫描对象引用关系,扫描到对象没有被引...
  • JavaScript中对象的引用是什么意思?主要是这个引用是什么意思? 我是在看原型的概念的时候看到的这句话,他说的是,【原型是对象的一个引用】这句话应该怎么解释呢?
  • Python中对象的引用和共享引用

    千次阅读 2016-10-01 19:14:13
    对于每个对象,都有一个头部信息,在信息中就标记了这个对象的类型信息。每当一个变量名被赋予了一个新的对象,之前那个对象占用的空间就回被回收(如果此时这个对象没有被别的变量名或者对象所引用的话)。另外,在...
  •  Binder代理对象的生命周期受到弱引用计数影响,接着调用当前线程内部的IPCThreadState对象的成员函数incWeakHandle来增加相应的Binder引用对象的引用计数。  ~/Android/frameworks/base/libs/binder  ---...
  • 当在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或者对象的引用变量;引用变量就相当于为数组或对象起了一个...
  • MRC可以直接获取对象的引用计数,像这样 NSLog(@"%lu",obj.retainCount); ARC下引用计数由编译器自动管理,不能够直接获取,所以上面的方式不能用了。可以用下面的几种方法: //1、利用KVC获取 [obj valueForKey:@...
  • Java集合不能存放基本数据类型,只存放对象的引用

    万次阅读 多人点赞 2017-05-06 13:52:15
    1. 集合存储对象Java集合中实际存放的只是对象的引用,每个集合元素都是一个引用变量,实际内容都放在堆内存或者方法区里面,但是基本数据类型是在栈内存上分配空间的,栈上的数据随时就会被收回的。2.
  •  在JDK1.2以前版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及状态,程序才能使用它。这 就像在日常生活中,从商店购买了某样物品后,如果有用,就一直

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 210,648
精华内容 84,259
关键字:

对象的引用