JAVA里面的“指针”
最终版权:JDram314 如转载请贴出出处!
众所周知,在java里面是没有指针的。那为何此处还要说java里面的“指针”呢?我们知道在C/C++中,指针是指向内存中的地址,该地址就是存储变量的值。该地址所存储的变量值是“公有”的,此处的“公有”是对于拥有该地址的变量而言。它们都可以访问该地址的内容,并且可对其就行修改,一经修改则所有指向该地址的变量值也将改变。那么在Java里面何来的指针?在java里面没有指针的定义。但是java里面的“指针”无处不在。下面将进行介绍。
我们知道JAVA里面用的最多的就是对象,我们经常将一个对象传递给不同的变量,例如:
- Student s1 = new Student();
- Student s2 = s1;、
此时s1和s2是指向同一个对象的,也就是s1和s2引用同一个对象,我们知道java里面创建一个对象是存放在堆的,当我们new一个对象的时候其实是在堆中开辟了一个存储该对象的空间,返回是的存储该对象在堆中的地址,所以在java中我们所谓的对象引用就是指针,只是没有像C/C++中给出了一个明确的定义。java是为了避免指针带来的使用上的麻烦,所以就使用对象的引用来代替了指针。上面的例子中,当我们在s1中进行修改Student中的属性的时候,那么当s2取Student中属性的值的时候便是取得了s1修改后的值,这是因为s1和s2是指向堆中的同一块内容,所以只要其中一个变量修改了堆中的值,则其他的变量将取得堆中最后更新的值。所以我们可以知道,s2=s1并不是又在堆中创建了一块内存,而只是把一个对象的地址赋给了s2,此时还是只是创建了一个对像,而不是两个。在实际开发中会经常碰到这些,假设创建一个Map<String,Object>类型的对象,它的value是一个对象,而key是一个字符串,定义如下:
- class Student{
- private String name;
- private int age;
- public void setAge(int age)
- {
- this.age = age;
- }
- public Student(String name)
- {
- this.name = name;
- }
- }
- Map<String,Student> studentMap = new HashMap<String,Student>();
- Student s1 = new Student("张三");
- Student s2 = new Student("李四");
- studentMap.put(s1.name,s1);
- studentMap.put(s2.name,s2);
此处是一个学生姓名对应了一个学生,所以此处的Map的key是学生姓名,value是一个学生对象。那么就是将一个Student对象的引用赋给了Map中key所对应的value,所以当程序在别处改变了s1/s2的值后,不必将s1和s2的信息更新到studentMap中,studentMap就会获得key所对应的value最新的值,例如:在程序的某处我们将s1的age修改成了“23”,我们不必将s1的最新信息更新到studentMap中,studentMap就会获得s1的最新值。这是因为已经将s1对象的引用赋给了studentMap中张三所对应的value,也就是将对象在堆中的地址赋给了value。所以只要s1一更新,studentMap就可以获得最新的值。
有时候这种情况会影响我们程序的执行和我们想想的会有偏差,当我们需要保存一个对象在某时刻的状态时,按照一般的理解是将此时的对象赋给一个变量来进行存储,但是在java里面这样是行不通的!因为这样直接将该对象赋给另一个变量只是将该对象的引用赋给了此变量,该变量的值并不能保持在此刻该对象的值,会随着程序的执行,该对象的改变而变化。所以达不到我们的目的。下面就举个例子来说明解决该现象:
有时候这种情况会影响我们程序的执行和我们想想的会有偏差,当我们需要保存一个对象在某时刻的状态时,按照一般的理解是将此时的对象赋给一个变量来进行存储,但是在java里面这样是行不通的!因为这样直接将该对象赋给另一个变量只是将该对象的引用赋给了此变量,该变量的值并不能保持在此刻该对象的值,会随着程序的执行,该对象的改变而变化。所以达不到我们的目的。下面就举个例子来说明解决该现象:
- class Student{
- private String name;
- private int age;
- public void setAge(int age)
- {
- this.age = age;
- }
- public Student(String name)
- {
- this.name = name;
- }
- public Student(Student student)
- {
- this.name = student.name;
- this.age = student.age;
- }
- }
- Student s1 = new Student("王麻子");
- s1.age=23;
- ........
- //此时要保存s1此刻的状态
- Student s2 = new Student(s1);
到此已全部介绍完有关java“指针”,其实java“指针”就是对象的引用,而对象就是存放在堆中的。我们知道java中的内存分为堆内存(heap)和栈内存(stack)。堆就是用来存放对象的,而栈则是存放一些数据基本类型的值,如int,float,double,char.......。此文到此基本结束,如有错误欢迎指出,欢迎评论!