关于this关键字、值传递与引用传递的知识与应用总结
程序员文章站
2022-07-12 12:15:58
...
关于this关键字、值传递与引用传递的知识与应用总结
一 this关键字
this在类中用来指代当前的对象,即指代引用者
//定义一个Student类
public class Student {
//属性和方法
private String name;
private String sex;
private double score;
//定义修改(设置)、获取名字属性值的方法
//根据Java的就进原则,需用this关键字来说明等号左值为类的属性值而不是方法的参数值
public void setName(String name){
this.name = name ;
}
public String getName(){
return name;
}
public void setSex(String sex){
this.sex = sex ;
}
public String getSex(){
return sex;
}
//定义一个学习方法
public void study(int score){
score++;
System.out.println(this.getName()+" 性别:"+this.getSex()+(" ,")+"学习中,学分为"+score);
}
}
//在另一个文件中定义程序入口
public class Test{
//定义主函数入口
public static void main(String [] args){
//实例化对象
Student stu = new Student();
//设置属性值
stu.setName("刘闯");
stu.setSex("男");
stu.study(5);
}
}
程序运行结果为:
刘闯 性别:男 ,学习中,学分为6
(在编写程序的过程中错把应为的“;”敲成了中文的“;”,一度为此纠结了半天)
扩展:this除了有指代当前的对象得功能外,还能作为参数进行传递,有兴趣的可以通过度娘了解一下。
二 值传递和引用传递
Java的数据类型分为两类:
.基本数据类型(八大基本数据类型)
byte 字节型 8bit 1byte -128~127
short 短整型 16bit 2byte
int 整型 32bit 4byte
long 长整型 64bit 8byte
float 浮点型单精度 32bit 4byte
double 浮点型双精度 64bit 8byte
char 字符型 16bit 2byte
boolean 布尔类型 true和false
1.值传递
值传递适用于Java的那些数据类型
值传递适用于Java中的八大基本数据类型和String。
值传递的方式
值传递是将变量i的值拷贝一份存入到另一个变量score,此时在栈内存中就存在了两块独立
存储空间,分别存储了i和score,这时候对其中任意一个变量进行修改都不会影响到另外一个。
如果想要两边都是修改后的值,那么就只能在修改后,将值重新再赋值一次。
//定义一个Student类
public class Student {
//属性和方法
private String name;
private String sex;
private double score;
//构造函数
public Student(String name){
this.name = name;
}
//定义修改(设置)、获取名字属性值的方法
//根据Java的就进原则,需用this关键字来说明等号左值为类的属性值而不是方法的参数值
public void setName(String name){
this.name = name ;
}
public String getName(){
return name;
}
public void setSex(String sex){
this.sex = sex ;
}
//定义一个学习方法
public void study(int score){
score++;
System.out.println(this.getName()+"学习中,学分为"+score);
}
}
//定义一个Book类
public class Book {
private String name;
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
}
//定义一个Test类
public class Test {
//程序的入口主函数
public static void main(String [] args){
//实例化一个Book类的对象
Book bo = new Book();
bo.setName("《Java》");
//实例化(创建)对象
Student stu = new Student("李四");
//实例化(创建)对象
Student stu2 = new Student("张三");
stu.study(5);
stu2.study(4);//调用学习方法
System.out.println("书名是:"+bo.getName());
}
}
程序运行结果为:
李四学习中,学分为6
张三学习中,学分为5
书名是: 《Java》
若将Test主函数中的代码改写:
//定义一个Test类
public class Test {
//程序的入口主函数
public static void main(String [] args){
//实例化一个Book类的对象
Book bo = new Book();
bo.setName("《Java》");
//实例化(创建)对象
Student stu = new Student("李四");
//实例化(创建)对象
Student stu2 = new Student("张三");
stu2.setName(stu.getName());//修改stu2的姓名
stu.study(5);
stu2.study(4);//调用学习方法
System.out.println("书名是:"+bo.getName());
}
}
程序运行结果为:
李四学习中,学分为6
李四学习中,学分为5
书名是: 《Java》
代码“stu2.setName(stu.getName());”将stu的name传递了stu2,度两个学生对象的
姓名都为李四。若对stu2的name属性值进行修改,不会影响到stu的name属性值,这是值
传递的单向性。对Tset的主函数改动如下:
//定义一个Test类
public class Test {
//程序的入口主函数
public static void main(String [] args){
//实例化一个Book类的对象
Book bo = new Book();
bo.setName("《Java》");
//实例化(创建)对象
Student stu = new Student("李四");
//实例化(创建)对象
Student stu2 = new Student("张三");
stu2.setName(stu.getName());//修改stu2的姓名
stu2.setName("王五");
stu.study(5);
stu2.study(4);//调用学习方法
System.out.println("书名是:"+bo.getName());
}
}
程序运行结果为:
李四学习中,学分为6
王五学习中,学分为5
书名是: 《Java》
2 引用传递
引用数据类型(对象类型,类类型)
包含的类型有:
1.所有用class,abstract class,interface定义的类,抽象类和接口。
2.数组 int [] array = new int[10];
只要是使用了new关键字,那么就属于引用数据类型。
引用传递的方式
引用传递是将对象名stu中存储的地址拷贝一份存入到stu2中,此时两个对象名就指向了同一个对象;现在适用其中任何一个对象名,来修改对象的属性值,那么另一个对象名的也会跟着改变(这就相当于1个人有两个名字)。
将上诉代码Test的主函数作如下改动:
//定义一个Test类
public class Test {
//程序的入口主函数
public static void main(String [] args){
//实例化一个Book类的对象
Book bo = new Book();
bo.setName("《Java》");
//实例化(创建)对象
Student stu = new Student("李四");
//实例化(创建)对象
Student stu2 = new Student("张三");
stu2 = stu;//赋值操作
stu.study(5);
stu2.study(4);//调用学习方法
System.out.println("书名是:"+bo.getName());
}
}
程序运行结果为:
李四学习中,学分为6
李四学习中,学分为5
书名是: 《Java》
无论对stu或stu2的name属性值做出修改,结果都会发生相应的改变:
//定义一个Test类
public class Test {
//程序的入口主函数
public static void main(String [] args){
//实例化一个Book类的对象
Book bo = new Book();
bo.setName("《Java》");
//实例化(创建)对象
Student stu = new Student("李四");
//实例化(创建)对象
Student stu2 = new Student("张三");
stu2 = stu;//赋值操作
stu.setName("王五");
stu.study(5);
stu2.study(4);//调用学习方法
System.out.println("书名是:"+bo.getName());
}
}
程序运行结果为:
王五学习中,学分为6
王五学习中,学分为5
书名是: 《Java》
对象名中存储的是对象的起始地址,对像名之间进行赋值“stu2 = stu;”是将stu的地址赋给了stu2
,两者都指向了同一内存空间,这就是引用传递。
各位领导,给位前辈,看一看,瞧一瞧,求指教!!!
一 this关键字
this在类中用来指代当前的对象,即指代引用者
//定义一个Student类
public class Student {
//属性和方法
private String name;
private String sex;
private double score;
//定义修改(设置)、获取名字属性值的方法
//根据Java的就进原则,需用this关键字来说明等号左值为类的属性值而不是方法的参数值
public void setName(String name){
this.name = name ;
}
public String getName(){
return name;
}
public void setSex(String sex){
this.sex = sex ;
}
public String getSex(){
return sex;
}
//定义一个学习方法
public void study(int score){
score++;
System.out.println(this.getName()+" 性别:"+this.getSex()+(" ,")+"学习中,学分为"+score);
}
}
//在另一个文件中定义程序入口
public class Test{
//定义主函数入口
public static void main(String [] args){
//实例化对象
Student stu = new Student();
//设置属性值
stu.setName("刘闯");
stu.setSex("男");
stu.study(5);
}
}
程序运行结果为:
刘闯 性别:男 ,学习中,学分为6
(在编写程序的过程中错把应为的“;”敲成了中文的“;”,一度为此纠结了半天)
扩展:this除了有指代当前的对象得功能外,还能作为参数进行传递,有兴趣的可以通过度娘了解一下。
二 值传递和引用传递
Java的数据类型分为两类:
.基本数据类型(八大基本数据类型)
byte 字节型 8bit 1byte -128~127
short 短整型 16bit 2byte
int 整型 32bit 4byte
long 长整型 64bit 8byte
float 浮点型单精度 32bit 4byte
double 浮点型双精度 64bit 8byte
char 字符型 16bit 2byte
boolean 布尔类型 true和false
1.值传递
值传递适用于Java的那些数据类型
值传递适用于Java中的八大基本数据类型和String。
值传递的方式
值传递是将变量i的值拷贝一份存入到另一个变量score,此时在栈内存中就存在了两块独立
存储空间,分别存储了i和score,这时候对其中任意一个变量进行修改都不会影响到另外一个。
如果想要两边都是修改后的值,那么就只能在修改后,将值重新再赋值一次。
//定义一个Student类
public class Student {
//属性和方法
private String name;
private String sex;
private double score;
//构造函数
public Student(String name){
this.name = name;
}
//定义修改(设置)、获取名字属性值的方法
//根据Java的就进原则,需用this关键字来说明等号左值为类的属性值而不是方法的参数值
public void setName(String name){
this.name = name ;
}
public String getName(){
return name;
}
public void setSex(String sex){
this.sex = sex ;
}
//定义一个学习方法
public void study(int score){
score++;
System.out.println(this.getName()+"学习中,学分为"+score);
}
}
//定义一个Book类
public class Book {
private String name;
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
}
//定义一个Test类
public class Test {
//程序的入口主函数
public static void main(String [] args){
//实例化一个Book类的对象
Book bo = new Book();
bo.setName("《Java》");
//实例化(创建)对象
Student stu = new Student("李四");
//实例化(创建)对象
Student stu2 = new Student("张三");
stu.study(5);
stu2.study(4);//调用学习方法
System.out.println("书名是:"+bo.getName());
}
}
程序运行结果为:
李四学习中,学分为6
张三学习中,学分为5
书名是: 《Java》
若将Test主函数中的代码改写:
//定义一个Test类
public class Test {
//程序的入口主函数
public static void main(String [] args){
//实例化一个Book类的对象
Book bo = new Book();
bo.setName("《Java》");
//实例化(创建)对象
Student stu = new Student("李四");
//实例化(创建)对象
Student stu2 = new Student("张三");
stu2.setName(stu.getName());//修改stu2的姓名
stu.study(5);
stu2.study(4);//调用学习方法
System.out.println("书名是:"+bo.getName());
}
}
程序运行结果为:
李四学习中,学分为6
李四学习中,学分为5
书名是: 《Java》
代码“stu2.setName(stu.getName());”将stu的name传递了stu2,度两个学生对象的
姓名都为李四。若对stu2的name属性值进行修改,不会影响到stu的name属性值,这是值
传递的单向性。对Tset的主函数改动如下:
//定义一个Test类
public class Test {
//程序的入口主函数
public static void main(String [] args){
//实例化一个Book类的对象
Book bo = new Book();
bo.setName("《Java》");
//实例化(创建)对象
Student stu = new Student("李四");
//实例化(创建)对象
Student stu2 = new Student("张三");
stu2.setName(stu.getName());//修改stu2的姓名
stu2.setName("王五");
stu.study(5);
stu2.study(4);//调用学习方法
System.out.println("书名是:"+bo.getName());
}
}
程序运行结果为:
李四学习中,学分为6
王五学习中,学分为5
书名是: 《Java》
2 引用传递
引用数据类型(对象类型,类类型)
包含的类型有:
1.所有用class,abstract class,interface定义的类,抽象类和接口。
2.数组 int [] array = new int[10];
只要是使用了new关键字,那么就属于引用数据类型。
引用传递的方式
引用传递是将对象名stu中存储的地址拷贝一份存入到stu2中,此时两个对象名就指向了同一个对象;现在适用其中任何一个对象名,来修改对象的属性值,那么另一个对象名的也会跟着改变(这就相当于1个人有两个名字)。
将上诉代码Test的主函数作如下改动:
//定义一个Test类
public class Test {
//程序的入口主函数
public static void main(String [] args){
//实例化一个Book类的对象
Book bo = new Book();
bo.setName("《Java》");
//实例化(创建)对象
Student stu = new Student("李四");
//实例化(创建)对象
Student stu2 = new Student("张三");
stu2 = stu;//赋值操作
stu.study(5);
stu2.study(4);//调用学习方法
System.out.println("书名是:"+bo.getName());
}
}
程序运行结果为:
李四学习中,学分为6
李四学习中,学分为5
书名是: 《Java》
无论对stu或stu2的name属性值做出修改,结果都会发生相应的改变:
//定义一个Test类
public class Test {
//程序的入口主函数
public static void main(String [] args){
//实例化一个Book类的对象
Book bo = new Book();
bo.setName("《Java》");
//实例化(创建)对象
Student stu = new Student("李四");
//实例化(创建)对象
Student stu2 = new Student("张三");
stu2 = stu;//赋值操作
stu.setName("王五");
stu.study(5);
stu2.study(4);//调用学习方法
System.out.println("书名是:"+bo.getName());
}
}
程序运行结果为:
王五学习中,学分为6
王五学习中,学分为5
书名是: 《Java》
对象名中存储的是对象的起始地址,对像名之间进行赋值“stu2 = stu;”是将stu的地址赋给了stu2
,两者都指向了同一内存空间,这就是引用传递。
各位领导,给位前辈,看一看,瞧一瞧,求指教!!!
推荐阅读