精华内容
下载资源
问答
  • java中到底没有指针
    万次阅读 多人点赞
    2017-06-24 22:54:53

    学过c/c++,然后学java的人往往心中有此纠结,java中到底有没有指针?
    如果一定要在是或否里选择一个,OK,java中没有指针。

    那么,java中的引用(reference)和c/c++中的指针(如无特别说明,后文指针均指c/c++中的指针)究竟有着什么样纠葛不清的关系呢?

    在开始之前先说一下c/c++的引用,它跟java的引用完全不是一个东西,c/c++的引用是同一块内存的不同名字。而java的引用是指向一个对象,引用本身也占用了内存。

    首先,列举一下能对指针进行的一些常见操作:
    1、指向一个对象,如 Person *p = new Person….;int *iv = new int….
    2、对指针所指的对象进行操作:P->getAge();            (*p).getAge();
    3、获取存储在指针中的地址值。
    4、将指针指向另外一个对象:Person *p1 = new Person…; p = p1;    但,不可以*p = p1这样来赋值。
    5、删除new的空间,delete p1;
    6、其它诸多操作

    这么多已经足够了,接下来看看java引用能做什么操作。
    a、指向一个对象,如Person p = new Person…
    b、调用对象的方法,p.getAge();
    c、指向另外一个对象,Person p1 = new Person…; p = p1;
    OK,就这么多了。

    对于a和1,他们的功能是类似的,但java引用无法指向一个基本变量。。
    对于b,java引用和指针就不同了,在这点上,java reference更像是解引用(dereference)了的指针;或者说java中的.操作符某种程度上等价于指针的->操作符,如果是这样种解释的话,我们无法再对java的reference解引用了。
    对c和4,是类同的。

    除此,我们无法获取java引用存的地址,我们不能delete,还有很多……

    综上,窃以为java的引用可以看成是一个功能受限的指针(或者说被阉割的指针)。另一方面,功能如此受限,它还能叫指针吗?了解了指针和java引用的区别与联系,还需要纠结“java中有没有指针”这个问题吗!

    更多相关内容
  • java没有指针

    千次阅读 2016-03-04 09:08:32
    通过查找资料了解Java不是没有指针,而是对指针进行了伪装:使用上泛化、强化和简单化,概念上淡化和弱化    cpp代码: Object a = Object();  Object * a = new Object();    也就是说当使用new方式...
    通过查找资料了解Java不是没有指针,而是对指针进行了伪装:使用上泛化、强化和简单化,概念上淡化和弱化

        cpp代码:

    Object a = Object(); 

    Object * a = new Object();  

            也就是说当使用new方式时,是动态为对象分配内在并将地址赋给oop这个指针变量。
         
    Java代码:
      Object a = new Object(); 
    比较一下,原来它就是使用了C++的动态内在分配方式创建了一个对象,并把地址返回给了a变量,也就是说a本 质上就是一个指 针变量。
            引申一下: JAVA中的对象类型本质上应该叫做“对象指针”类型。那么传统的对象类型呢?

    在JAVA里已经不见了踪影!

     既然没有了传统的对象类型,那么对象指针变量前面的*也就可以不要了。

      对象指针变量也就可以简称为对象变 量了,
     反正  也不会和其它概念混淆!所有的对象变量都是指针,没有非指针的对象变量,想不用指针都不行,这就是  指针的泛化和强化。 
      
     java 中 不叫指针了,就叫对象变量,这就是概念上的淡化和弱化。没有了指针的加减运算,也没有了*、-> 等运算符, 这 是对指针的简单化。 
            这可以从很多方面得到验证...

    展开全文
  • Java没有指针

    千次阅读 2020-11-13 18:48:22
    1.Java中没有指针? 有些没学过c的朋友可能还不知道什么指针。...确实,Java中没有指针的概念,但是学过c语言的小伙伴很快就会新的疑惑——“如果Java不存在指针的话,那么是如何实现复杂的数据结构?”

    1.Java中没有指针?

    有些没学过c的朋友可能还不知道什么指针。

    指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(Pointed to)存在电脑存储器中另一个地方的值。也就是通过地址可以找到所需的变量单元,可以说,地址指向该变量单元。

    那么Java中有没有指针呢?
    有些初学Java的小伙伴可能会说:“Java中哪里有指针呢?我见都没见过”。
    确实,Java中没有指针的概念,但是学过c语言的小伙伴很快就会有新的疑惑——“如果Java不存在指针的话,那么是如何实现复杂的数据结构?”

    事实上,Java可以说处处存在指针!

    JAVA中的对象类型本质上应该叫做 对象指针 类型。那么传统的对象类型呢?在JAVA里已经不见了踪影! 既然没有了传统的对象类型,那么对象指针变量 前面的也就可以不要了。对象指针变量也就可以简称为对象变量了, 反正也不会和其它概念混淆!
    所有的对象变量都是指针,没有非指针的对象变量,想不用指针都不行,这就是指针的泛化和强化。
    不叫指针了,就叫对象变量,这就是概念上的淡化和弱化。 没有了指针的加减运算,也没有了*、->等运算符,这是对指针的简单化

    虽然没有指针的名但有指针的实。

    2.指针?引用?

    但你要是仔细一想,这里的指针似乎跟c语言中的指针又有所区别。

    在C++的对象指针里面,出现的指针运算符主要有以下几个:*,->。

    运算符*是返回指针所指向的对象,而->是返回指针所指向对象的数据成员或方法成员。由于不存在对象变量,而是通过指针来访问对象的,因此Java中不需要提供*运算符,这是Java优化了C++的一个指针问题。对于->运行符,Java的指针是提供的,不过是采用.运算符的方式提供,看起来与C++中对象变量的.运算符一样,其实意义是有不一样的地方。
    如:

    String s = new String(“abc”);
    s.indexOf(“a”);
    

    与下面C++代码等价的

    String *s = new String(“abc”);
    s->indexOf(“a”);
    

    总的来看主要有以下三点区别:

    • C++中的指针是可以参与和整数的加减运算的,当一个指对指向一个对象数组时,可以通过自增操作符访问该数组的所有元素;并且两个指针能进行减运算,表示两个指表所指向内存的“距离”。而Java的指针是不能参与整数运算和减法运算的。

    • C++中的指针是通过new运算或对象变量取地址再进行赋值而初始化的,可以指向堆中或栈中的内存空间。Java同样是类似的,通new运算得到初始化。Java中指针只能是指向堆中的对象,对象只能生存在堆中。C语言是可以通过远指针来指向任意内存的地址,因而可以该问任意内存地址(可能会造成非法访存);Java中的指针向的内存是由JVM来分配的中,由于new运算来实现,不能随所欲为地指向任意内存。

    • C++中通过delete和delete[] 运算符进行释放堆中创建的对象。如果对象生存周期完结束,但没有进行内存释放,会出现内存泄露现象。在Java中,程序员不用显式地释放对象,垃圾回收器会管理对象的释放问题,不用程序员担心。Java使用了垃圾回收机制使得程序不用再管理复杂的内存机制,使软件出现内存泄露的情况减少到最低。

    对于这个问题,在Tinking in Java中是这样描述的:

    Java 利用万物皆对象的思想和单一一致的语法方式来简化问题。虽万物皆可为对象,但我们所操纵的标识符实际上只是对对象的“引用” [^1]。

    “名字代表什么?玫瑰即使不叫玫瑰,也依旧芬芳”。(引用自 莎士比亚,《罗密欧与朱丽叶》)。
    所有的编程语言都会操纵内存中的元素。有时程序员必须要有意识地直接或间接地操纵它们。在 C/C++ 中,对象的操纵是通过指针来完成的。
    Java 利用万物皆对象的思想和单一一致的语法方式来简化问题。虽万物皆可为对象,但我们所操纵的标识符实际上只是对对象的“引用” [^1]。 举例:我们可以用遥控器(引用)去操纵电视(对象)。只要拥有对象的“引用”,就可以操纵该“对象”。换句话说,我们无需直接接触电视,就可通过遥控器(引用)自由地控制电视(对象)的频道和音量。此外,没有电视,遥控器也可以单独存在。就是说,你仅仅有一个“引用”并不意味着你必然有一个与之关联的“对象”。
    下面来创建一个 String 引用,用于保存单词或语句。代码示例:
    String s;
    这里我们只是创建了一个 String 对象的引用,而非对象。直接拿来使用会出现错误:因为此时你并没有给变量 s 赋值–指向任何对象。通常更安全的做法是:创建一个引用的同时进行初始化。代码示例:
    String s = “asdf”;
    Java 语法允许我们使用带双引号的文本内容来初始化字符串。同样,其他类型的对象也有相应的初始化方式。
    这么看来如果用引用这个词描述更加准确,并且官方也是这样来描述。

    [^1]: 这里可能有争议。有人说这是一个指针,但这假定了一个潜在的实现。此外,Java 引用的语法更类似于 C++ 引用而非指针。在《Thinking in Java》 的第 1 版中,我发明了一个新术语叫“句柄”(handle),因为 C++ 引用和Java引用有一些重要的区别。作为一个从 C++ 的过来人,我不想混淆 Java 可能的最大受众 —— C++ 程序员。在《Thinking in Java》的第 2 版中,我认为“引用”(reference)是更常用的术语,从 C++ 转过来的人除了引用的术语之外,还有很多东西需要处理,所以他们不妨双脚都跳进去。但是,也有些人甚至不同意“引用”。在某书中我读到一个观点:Java 支持引用传递的说法是完全错误的,因为 Java 对象标识符(根据该作者)实际上是“对象引用”(object references),并且一切都是值传递。所以你不是通过引用传递,而是“通过值传递对象引用。人们可以质疑我的这种解释的准确性,但我认为我的方法简化了对概念的理解而又没对语言造成伤害(嗯,语言专家可能会说我骗你,但我会说我只是对此进行了适当的抽象。)

    但我更倾向于另一个解释:

    Java中的引用与C++中的引用是不同的,并且Java中的引用更像C++中的指针。因此,可以认为Java中的引用就是指针,是一种限制的指针,不能参与整数运行和指向任意位置的内存,并且不用显示回收对象。除了Java外,就本文开头提到的C#以及VB.NET中出现的引用,都类似于C++中的指针。Java中的采用引用的说法,其实是想程序员忘记指针所带来的痛苦;Java的引用比C++中的指针好用得多了,也容易管理,同时提供内存管理机制,让大家用得安心,写得放心而已。

    Java中的引用就是一种有限制的指针!

    参考文章:
    Thinking in Java,
    https://blog.csdn.net/linyt/article/details/1573864

    展开全文
  • Java中的所有对象都是引用,您可以像使用指针一样使用它们。abstract class Animal{...}class Lion extends Animal{...}class Tiger extends Animal{public Tiger() {...}public void growl(){...}}Tiger first = ...

    Java中的所有对象都是引用,您可以像使用指针一样使用它们。

    abstract class Animal

    {...

    }

    class Lion extends Animal

    {...

    }

    class Tiger extends Animal

    {

    public Tiger() {...}

    public void growl(){...}

    }

    Tiger first = null;

    Tiger second = new Tiger();

    Tiger third;

    取消引用null:

    first.growl();  // ERROR, first is null.

    third.growl(); // ERROR, third has not been initialized.

    混叠问题:

    third = new Tiger();

    first = third;

    丢失的细胞:

    second = third; // Possible ERROR. The old value of second is lost.

    您可以通过首先确保不再需要第二个旧值或为另一个指针分配第二个值来确保此安全。

    first = second;

    second = third; //OK

    请注意,以其他方式给second赋值(NULL,new ...)同样是潜在的错误,并可能导致丢失其指向的对象。

    OutOfMemoryError当您调用new并且分配器无法分配所请求的单元格时,Java系统将引发异常()。这是非常罕见的,通常是由于失控的递归导致的。

    请注意,从语言的角度来看,将对象放弃到垃圾回收器根本不是错误。这只是程序员需要注意的事情。相同的变量可以在不同的时间指向不同的对象,并且当没有指针引用它们时,旧值将被回收。但是,如果程序的逻辑要求维护对对象的至少一个引用,则将导致错误。

    新手经常会犯以下错误。

    Tiger tony = new Tiger();

    tony = third; // Error, the new object allocated above is reclaimed.

    您可能要说的是:

    Tiger tony = null;

    tony = third; // OK.

    铸造不当:

    Lion leo = new Lion();

    Tiger tony = (Tiger)leo; // Always illegal and caught by compiler.

    Animal whatever = new Lion(); // Legal.

    Tiger tony = (Tiger)whatever; // Illegal, just as in previous example.

    Lion leo = (Lion)whatever; // Legal, object whatever really is a Lion.

    C中的指针:

    void main() {

    int*    x;  // Allocate the pointers x and y

    int*    y;  // (but not the pointees)

    x = malloc(sizeof(int));    // Allocate an int pointee,

    // and set x to point to it

    *x = 42;    // Dereference x to store 42 in its pointee

    *y = 13;    // CRASH -- y does not have a pointee yet

    y = x;      // Pointer assignment sets y to point to x's pointee

    *y = 13;    // Dereference y to store 13 in its (shared) pointee

    }

    Java中的指针:

    class IntObj {

    public int value;

    }

    public class Binky() {

    public static void main(String[] args) {

    IntObj  x;  // Allocate the pointers x and y

    IntObj  y;  // (but not the IntObj pointees)

    x = new IntObj();   // Allocate an IntObj pointee

    // and set x to point to it

    x.value = 42;   // Dereference x to store 42 in its pointee

    y.value = 13;   // CRASH -- y does not have a pointee yet

    y = x;  // Pointer assignment sets y to point to x's pointee

    y.value = 13;   // Deference y to store 13 in its (shared) pointee

    }

    }

    更新:如注释中所建议,必须注意C具有指针算法。但是,我们在Java中没有。

    展开全文
  • 经过几天的奋战,终于让我搞懂了JNA的解析以及指针在结构体中的应用!!!下了很多的资料,里面包含c++的.h头文件,给需要帮助的人看看!! 里面包含代码以及解析过程。
  • JAVA里面的“指针

    千次阅读 2018-01-19 22:49:55
    [java] view plain copy "font-family:Arial, Verdana, sans-serif;">"white-space: normal;">"code" class="java">  ...JAVA里面的“指针” 最终版权:JDram314 如转载请贴出出处!  
  • 文章目录前言1....相比C语言,Java中的“引用数据类型”,和C语言中的“指针”比较相似,所以这里将两者进行对比分析。 1. Java中“基本数据类型”和“引用数据类型”变量在内存分配时的不同 对于“基本
  • Java编程中,我们或多或少地会遇到一些程序异常的情况,为了不影响程序的正常执行,我们需要在程序发生异常的情况下,进行一些操作来防止造成更大的损失。例如在我们平时的除法运算中,被除数是不能为0的,如果为0...
  • 最近在跑一个公司花钱买的古老区块链,项目15年开发的。遇到了一个注入问题。该项目中注入jedisPool时使用了getBean()注入,然而怎么跑都是NullPoint,一翻扣头发后得已解决。 解决方法1 使用@Autowired的方式注入 ...
  • 小智..11使用运算符的新Java 8 功能接口和方法参考::.Java 8能够使用" @ Functional Interface "指针维护方法引用(MyClass :: new).不需要相同的方法名称,只需要相同的方法签名.例:@FunctionalInterfaceinterface ...
  • Java中的"指针

    2021-03-07 05:35:02
    Java语言一个优点就是它相对其他编程语言(例如C语言)摒弃了指针的数据类型,但是否真的摒弃了还得仔细研究一下java的内部机制。Java中的堆栈Java堆栈都在Ram中,与其他一些语言不同的是这些堆栈一部分是由Java中的...
  • 什么是java指针异常我们都知道java是没有指针的,这里说的"java指针"指的就是java的引用,我们不在这里讨论叫指针究竟合不合适,而只是针对这个异常本身进行分析。空指针就是空引用,java指针异常就是引用本身为...
  • Java造成空指针异常的原因

    千次阅读 2020-05-29 11:24:13
    map.get("aa").toString() map取值为null,转字符串会报空指针
  • Java 中的“函数指针

    万次阅读 2018-02-13 12:07:10
    [一点废话] 很久都没有管理过自己的博客了,原先只是想...最近又重新看了比较新的《Java核心卷 第十版》,发现了值得记录的一些内容,这里就结合我自己的体会总结下,鉴于本人水平有限,如果什么理解不对的地方,...
  • java常见空指针的情况

    千次阅读 2020-07-13 23:32:28
    java程序中如果变量为null,就意味着它是没有引用指向或者说指针,这个时候对这个变量做任何操作都会产生空指针异常( NullPointerException)。 下面五种情况下最容易出现空指针异常。 1.参数值为Integer等包装类型...
  • 转载:https://mp.weixin.qq.com/s/CMjs36IXp1E2EyKiaCz80g相信在座的各位都遇到过空指针异常,不甚其烦,本文不是教你避免空指针,而是一些对空指针其他方面的理解。本文可能有点另类,也可能会打破你对空指针的...
  • } } 请求进程错误,空指针错误,报空指针异常。紧跟的是错误代码的位置。 threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause java.lang....
  • 关于java的空指针报错: 最常见的空指针报错是因为在一个类的对象指针创建之后再调用它,没有给他分配空间,直接调用这个对象的方法或者数据,当然这个说起来还是很简单的,大部分的人都不会犯这样的错误,但是在...
  • java数组空指针问题

    千次阅读 2018-05-11 17:16:00
    java中空指针异常算是一个比较棘手的问题,下面通过一个例子来讲解一下怎么处理空指针,以及出现空指针的问题比如,我们先建好一个Book类,里面包括name属性和bNumber(统计书的总数),并写出get和set方法。...
  • 指针异常(Null Pointer Exception)是我们平时最容易碰到的,也是最令人讨厌的异常。本文介绍如何避免出现空指针异常。首先我们看如下的示例private Boolean isFinished(String status) {if (status....
  • Java指针异常的几种情况

    千次阅读 2020-05-11 23:42:44
    Java指针异常的几种情况 NullPointerException 说法一 NullPointerException由RuntimeException派生出来,是一个运行级别的异常。意思是说可能会在运行的时候才会被抛出,而且需要看这样的运行级别异常是否会...
  • 偶发性空指针,具体日志信息如下: 解决: 1、原本我在生命周期onStop里调用的mlocationClient.stop(); 把它改到在onDestroy调用 2、onDestory里面执行mBaiduMap=null; 其他地方用mBaiduMap进行非空判断 3、简单so...
  • 众所周知,在java里面是没有指针的。那为何此处还要说java里面的“指针”呢?我们知道在C/C++中,指针是指向内存中的地址,该地址就是存储变量的值。该地址所存储的变量值是“公有”的,此处的“公有”是对于拥有该...
  • Java(this指针

    千次阅读 2018-09-26 17:43:56
    当前时刻,哪个对象调用该函数,那么this就指向当前调用该函数的对象,系统就会自动在该函数的参数列表中添加一个隐藏的this指针,并且把调用该函数的对象地址赋给this指针,这样一来,在函数的内部通过this就可以...
  • 今天在学习javaweb时,在web连接数据库时一直报空指针异常,反复看了好几遍视频一直以为是自己代码敲错了,后面debug发现是读取配置文件的问题,输入流is一直没有赋上值;后面捣鼓了好一阵都没用弄出来;网上收了很...
  • Java的引用到底是什么?和C/C++的指针有什么区别?
  • java中的空指针解决方案(NullPointerException)
  • java中空指针异常情况以及解决办法

    千次阅读 2020-12-05 13:42:54
    出现空指针异常,常常是因为我们调用的对象是空的而抛出的异常。 问题描述: 第一种:  out.println(request.getParameter("username")); 如果request里面并没有username的值,这时无法对空对象进行操作的,就会抛...
  • 但像java等其他一些语言则不会这样的问题,为什么呢,因为它们很好的处理内存的方法,比如java的垃圾回收机制,现在,我们c++终于也了智能指针。 1. 什么是智能指针 简单地说,智能指针是用对象去管理一个...
  • java指针异常:预防及解决办法

    千次阅读 2020-02-11 11:26:27
    我们都知道java是没有指针的,这里说的"java指针"指的就是java的引用,我们不在这里讨论叫指针究竟合不合适,而只是针对这个异常本身进行分析。空指针就是空引用,java指针异常就是引用本身为空,却调用了方法,这...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 168,724
精华内容 67,489
关键字:

java里面有指针吗

java 订阅