Java中的指针和this指针、super指针

Java中的“指针”

JAVA的指针操作都被底层代码封装了。如果对这句话不是太理解,可以看一下这篇博客了解一些入门知识。

在博客中见到这样一句话——“在JAVA中数据可以简单分为两种类型,基本类型和引用类型”,并且“在java中只有引用类型才有引用”——其中,基本数据类型包括四种整数型 byte、short、int、long;两种浮点型float、double;一种字符类型char;一种布尔型boolean(全否?)。引用类型:可以说有无数种,包括String、数组、object等等——如果能对这句话有一个深入的理解,要么下面这段话就不用看了。

Java中所有的基本数据类型————“包括String,这不代表String也是基本数据类型,事实上因为String类都是被final关键字修饰的,所以它的值不会变化,所以,字符串拼接之类的操作事实上只是在内存中开辟了一个新的空间,而原有的空间其实还存在,所以这就是为什么字符串的操作要使用StringBuffer类的原因”————的传递,都是按值传递,即直接将数值传递过啦,传递的都是形参(即复制操作,在内存中,JVM只是把你操作的数据复制了一份给你传递到的对象,而非把它本身传递了过去。)。除此以外的其他任何传递(包括基本数据类型的数组)都是按地址传递,传递过去的都是实参,即cpp概念中的引用传递。详见此链接

实参、形参、深拷贝、浅拷贝、String被final修饰、Sting操作要用StringBuffer的原因

当我们使用new创建一个对象时,其实就是在堆中开辟了一个存储该对象的空间,返回是的存储该对象在堆中的地址,所以在java中我们所谓的对象引用就是指针,只是没有像C/C++中给出了一个明确的定义。

解决方案:

public Student(Student student)  
{  
	this.name = student.name;  
	this.age = student.age;  
}

//使用构造函数
Student s2 = new Student(s1);  

使用此方式避免S2 = S1;的引用传递的麻烦,准确性和更详细的内容详见这篇博客

Java中的引用与C中指针的区别

详见这篇博客,写的非常好,这里简述以下上面博客提到的二者间的区别:

Java的引用代表的是某个值所在的内存的地址

这个值不是某块内存的地址,而是某个值所在内存的地址。引用关注的是值,当值搬家后(比如Java中自己管理内存时进行的内存碎片整理),引用也会跟着改。引用是一个封装过的指针(自认为封装的功能就是如何跟着值搬家),它屏蔽了指针的复杂性,在编译器的实现中,引用最后还是会被转成指针

句柄里存储的就是对象的地址,句柄就是指针,只不过是你无法得到的地址。待确认

C语言的指针代表的是某块内存的地址

不管所存储的变量或者值发生什么样的变化,指针始终指向这一个内存块。

二者语法上的区别

引用一旦和某个对象绑定后就不再改变,始终指向最初的对象

剩下的可以看这篇博客,虽然不是太好这篇。等以后找到更合适的,再回来补充。

this指针和super指针

(待验证)this 和super在构造函数中只能有一个,且都必须是构造函数当中的第一行(换个说法,就是构造函数调用其它构造函数,需要将this写在构造函数的第一行)。这样做的理由,有一篇博客是这样解释的,“因为初始化动作总是要先执行,如果初始化里还有更细的初始化,则从最小粒度的初始化开始,先执行”。

this指针

目前自认,this指针用于指向 定义该this指针的类 的当前对象。

(自认)每个类可能会有很多个对象,而属性,除了static以外,又都属于每个对象,那么在定义类的方法时,该如何表示、使用这些属性、方法呢?this指针应运而生。
 
还有博客提到,使用this指针是因为每个类的对象,它们的属性会在堆中一个个创建,但是类的方法却是共用的——统一放在内存的code segment——不论哪个对象,用到这些方法,都去这个统一的存放点调用。那么问题也就产生了,这些方法如何区分是哪个对象调用的自己,或者更通俗地说,这些方法怎么知道此时传入的各个属性值是多少(因为不同的对象,属性值很可能不同)。

每个对象都有一个属于自己、指向自己的指针——this指针。通过this可以明确去访问一个类的成员变量,解决与局部变量名称冲突问题,this.age=age。

this指针还可以用来①返回当前对象的引用(return this)②表示构造函数(this()表示无参的默认构造函数;this(参数)表示有参的构造函数),详见下面的链接“this指针的用途”

除了上述这些之外,还有几点需要注意,待确认:
①只能在构造方法中使用this调用其他方法,不能在成员变量中使用
②不能再一个类的两个构造方法中使用this互相调用

此处推荐几篇博客,大家可以看一下:
入门级,里面还有示例
原理解释
this指针的用途
this调用无参构造函数的代码示例
public Person(string name , int age) : this(name , age , string.Empty) { }的写法
内容一般,可以作为补充材料

super指针

子类可以通过它调用父类的构造函数。
当父类的构造函数是有参构造函数时,此时如果子类的构造函数中不写super()进行调用父类的构造函数,编译器会报错,此时不能省去super(参数),详见代码示例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值