对 JAVA 中 “指针“ 的理解

文章通过Java代码示例解释了指针的概念,特别是在数组和对象实例化中的应用。指出了Java中数组即使未赋值也已分配空间,而对象必须通过`new`关键字分配空间。文章通过创建和赋值`good`类的对象数组,展示了空指针异常的情况,并说明了如何避免这种异常。同时,对比了数组与空指针的区别,并提供了判断它们是否为空的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于Java中的指针,以下典型案例会让你对指针的理解更加深刻。

首先对于:

f24826fcb2a34d9c9895c4cf831503da.png

  系统自动分配对应空间储存数字 1,这个空间被变量名称b所指向即:

  b                    ——>                1

变量名称                                空间

**************************************************************************************************************

明白上述再来分析以下典型案例:

import java.util.*;
 
public class Main {
    public static int N = 100;
    public static void main(String[] args) {
      good a[] = new good[N];
      a[0].m = 1;
      a[0].v = 2;
      System.out.print(a[0].m + " " + a[0].v);
	  }
}
class good{
	int m;
	int v;
	good(){};
}

对以上代码的测试结果可以试着自己分析一下,正确结果如下:

8e2694384a704b218baeb01f1a370d1d.png

为什么会报错?对代码进行分析:

    1. 首先我们设立了一个good类,并定义了一个good类数组a。即a[0],a[1].......,a[N - 1]都是good类。

    2.对a[0]内的m,v进行赋值。

对a[0]单独输出试试 :

import java.util.*;
 
public class Main {
    public static int N = 100;
    public static void main(String[] args) {
      good a[] = new good[N];
      System.out.print(a[0]);
	  }
}
class good{
	int m;
	int v;
	good(){};
}

输出: dfb69a06805a44d8a7d4d28551ebb0d1.png

即:  a[0]     ——>       null

  推测出,本代码没有给a[0]分配空间,即只有变量名,没有指向空间。那么a[0]就是一个good类空指针。

修改方法:

import java.util.*;
 
public class Main {
    public static int N = 100;
    public static void main(String[] args) {
      good a[] = new good[N];
      a[0] = new good();
      a[0].m = 1;
      a[0].v = 2;
      System.out.print(a[0].m +" "+ a[0].v);
	  }
}
class good{
	int m;
	int v;
	good(){};
}

输出:

c2098468168c47b2b5209c56b66919a3.png

即:给a[0]分配空间后再对,空间内部变量m,v操作 。

为了进一步证明a[0]是good类型空指针:

  如下对a[1]分配空间,对内部变量进行操作,再让a[0] 指向 a[1]所指向的空间即a[0],a[1]都指向一处空间:

import java.util.*;
 
public class Main {
    public static int N = 100;
    public static void main(String[] args) {
      good a[] = new good[N];
      a[1] = new good();
      a[1].m = 1;
      a[1].v = 2;
      System.out.println(a[0]);
      a[0] = a[1];//a[0]指向a[1]
      System.out.println(a[0].m +" "+ a[0].v);
      System.out.print(a[1].m +" "+ a[1].v);
	  }
}
class good{
	int m;
	int v;
	good(){};
}

输出: 

b4f4428f6fa1464b9668a0325f6862e6.png

  即 good  b;就是创造一个good 类空指针b。

  b = new good();就是给b分配一个空间。

---------------------------------------------------------------------------------------------------------------------------------

值得注意的是对于java中的数组 :

1.

输出nums:

nums 指向的是一片地址,这片地址已经被占用只是还未被开发 。所以严格意义上讲num指向的并不是空。

2. 而对于:

输出aus:

所以两者本质的区别在于前者指向了一片未被开发的空间,而后者未指向任何空间,是一个单纯的空指针。 而两者本质上都是指针。

对于前者的判断直接判断 nums.length是否等于零即可,对于后者判断直接判断aus是否等于null即可。 两者判断方式不可交换。

为了进一步证明两者皆是指针请看以下代码:

import java.util.*;

public class Main {
	 
    public static void main(String[] args) {
       int aus[] = null;
       System.out.println(aus);
       int nums[] = {};
       System.out.println(nums);
       int ads[] = {1};
       System.out.println(ads);
       nums = ads;
       aus = ads;
       System.out.println("******************");
       System.out.println(ads + " " + ads[0]);
       System.out.println(nums + " " + nums[0]);
       System.out.print(aus + " " + aus[0]);
	  }
 
}

输出:

 

以上就是我对这些典型事例的理解。 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值