来到黑马半个月了,上了半个月的Java基础课程,在大学里专业是电子科学与技术,大学课程里有关编程的课程也只学习过C语言。初识面向对象语言,困惑中学习,学习中感悟。
首先说一下学习经历,面向对象语言是基于面向基础语言的,因此Java的一些基础知识和C语言很像。如:基本数据数据类型,变量,运算符,三种流程控制,数组等。后来又学习了面向对象的根本,类和对象。紧接着学习了常用的API和集合,还有接下来要学习的IO流等。
在这些基础知识中,有关基本数据类型和引用数据类型在方法中用作参数传递的案例,往往会给初学者带来一些困扰。自己在学习的过程中,有一点小小的感悟和大家分享一下。
首先,编程最终操作的是计算机最底层的硬件,我们的每一行代码进入到硬件中都是去获取或修改内存中的数据。面向对象有一个基本特征是封装,有了封装这一特性,让面向对象看上去不像C语言中那么“杂乱无章”。
Java中对于引用数据类型进行了很好的封装,引用数据类型创建的对象存储在堆内存中,而我们无法直接区操作这块内存,我们能得到的只是这块内存的地址,即引用。因此,当引用类型数据作为参数传递时,基于“值传递”的原则,调用方法时,该方法获取的也是实际对象的引用,而对象在堆内存中的地址是唯一的,方法间通过传递这唯一的地址来实现对象的操作。
举个例子,你(主方法或其他成员方法)创建一个对象并初始化时,就好比买了一套房子,然后创建对象的地方(即这个引用类型变量被定义的地方)只拿到了房子的钥匙,任何人想改变这个房子中的东西都需要这把钥匙。当引用类型变量当作实参被传入到方法A,方法B或方法C中时,就好比分别配了一把钥匙给其他方法,其他方法都可以通过这把钥匙进入这间房子,因此其他方法对这间房子的任何操作都会影响你的房子。
继续上个例子,来说一下“你“是主方法和其他方法两种情况,主方法是程序的入口,给我们的感觉是程序开始存在,程序结束消失。方法中的变量(钥匙)是在方法结束是被释放的。当“你”是主方法时,这把钥匙就会一直存在。但是,当你是成员方法时,如果你在成员方法中定义了一个引用类型变量并初始化时,堆内存中依然会给你建一套房子并把钥匙给你,但如果成员方法结束后有人想继续用这套房子,就需要在方法结束前把钥匙传递出来。
而对于基本类型数据作为参数传递时,本着“值传递”的原则,系统只能买一套一模一样的房子作为实参传递给方法,因此方法中对房子的任何操作都不会影响原本的那套房子。
这里有一个特例,那就是引用类型数据中的String类型。String类型虽然是一个引用数据类型,但它有个创建后不可变的特性。虽然String类型在作为参数传递时传递的也是引用(钥匙),但这个不可变的房子一旦需要改变,系统只能通过消耗内存的方式来再建一套房子任你改造,同时你改造几次系统就需要给你建几套房子。
新人见解,如有错误之处,改,改,改。
|
|