「java定义指针」java类指针

博主:adminadmin 2022-12-26 00:27:05 79

今天给各位分享java定义指针的知识,其中也会对java类指针进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

java 中指针是怎么定义的?

Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文会试图澄清这一概念。并且由于Java不能通过简单的赋值来解决对象复制的问题,在开发过程中,也常常要要应用clone()方法来复制对象。本文会让你了解什么是影子clone与深度clone,认识它们的区别、优点及缺点。

看到这个标题,是不是有点困惑:Java语言明确说明取消了指针,因为指针往往是在带来方便的同时也是导致代码不安全的根源,同时也会使程序的变得非常复杂难以理解,滥用指针写成的代码不亚于使用早已臭名昭著的GOTO语句。Java放弃指针的概念绝对是极其明智的。但这只是在Java语言中没有明确的指针定义,实质上每一个new语句返回的都是一个指针的引用,只不过在大多时候Java中不用关心如何操作这个指针,更不用象在操作C++的指针那样胆战心惊。唯一要多多关心的是在给函数传递对象的时候。如下例程:

package reference;

c2.strBuff.append( change strBuff clone);

改成下面这样:

c2.str.substring(0,5);

c2.strBuff.append( change strBuff clone);

去掉了重新赋值的过程,c2.str也就不能有变化了,我们的把戏也就露馅了。但在编程过程中只调用

c2.str.substring(0,5);

语句是没有任何意义的。

应该知道的是在Java中所有的基本数据类型都有一个相对应的类,象Integer类对应int类型,Double类对应double类型等等,这些类也与String类相同,都是不可以改变的类。也就是说,这些的类中的所有方法都是不能改变其自身的值的。这也让我们在编clone类的时候有了一个更多的选择。同时我们也可以把自己的类编成不可更改的类。

java中指针操作是什么意思

众所周知,在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,此时还

是只是创建了一个对像,而不是两个。在实际开发中会经常碰到这些,假设创建一个MapString,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;

}

}

MapString,Student studentMap = new HashMapString,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里面这样是行不通的!因为这样直接将该对象赋给另一个变量只是将该对象的引用赋给了此变量,该变量的值并不能保持在此刻该对象的值,

会随着程序的执行,该对象的改变而变化。所以达不到我们的目的。下面就举个例子来说明解决该现象:

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类,基

本和上面一样,只是多添加了一个构造函数——Student(Student

student),为什么要多加这样一个函数呢?这就是为了满足我们上面的需求(保存对象某个时刻下的状态),我们知道直接将一个对象赋给一个变量会存在

对象的引用,不能保存对象某时刻的状态。同时也知道要想保存一个对象就要在堆中开辟一个空间,用于存放我们的对象。其实上面的需求可以看做当我们要保存某

时刻下对象的状态,其实就是该对象的状态不会随以后对象的变化而变化,所以何不将当前某时刻下对象的状态属性全部都复制到一个新的对象中去!这样保存下来

的属性就不会受以后对象的变化而变化了。就上面的例子,举例说明:

Student s1 = new Student("王麻子");

s1.age=23;

........

//此时要保存s1此刻的状态

Student s2 = new Student(s1);

此时s1和s2就不是指向堆中的一个地址了,因为s2不是直接将s1赋给它的,而是通过new出来的!上面说了new可以在堆中开辟一个存储当前new的

对象的空间。这种操作可以实现将s1中的状态全都转移到s2中,所以在值的方面看s2和s1此时是一样的,但是在堆中确实不一样的,s1!=s2,因为

s1和s2的hashcode不一样!但是s1.name.equal(s2.name)==ture,s1.age=s2.age。这不就实现了保存某

个对象某个时刻下的状态了吗?而切不会在受程序执行的影响!

到此已全部介绍完有关java“指针”,其实java“指针”就是对象的引用,而对象就是存放在堆中的。我们知道java中的内存分为堆内存(heap)

和栈内存(stack)。堆就是用来存放对象的,而栈则是存放一些数据基本类型的值,如int,float,double,char.......。

在java中怎样定义一个指针使之指向一个数组的最后一个数????

java中没有指针,数组中叫下标。如int []a=new int{1,2,3,4,5};

数组的下标从0开始,数组的最后一位是a[4]值是5,或者a[a.length=1];a.length是数组的长度,数组的长度-1就是数组的最后一位的下标,数组是通过下标获得数组的值

java定义指针的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java类指针、java定义指针的信息别忘了在本站进行查找喔。

The End

发布于:2022-12-26,除非注明,否则均为首码项目网原创文章,转载请注明出处。