引用传递实例分析

引用传递进阶分析

引用传递是Java的精髓,也是初学者最难学到地方。以下用三道题进行分析。
范例:第一道

class Demo{
	private int num=10;
	public Demo(int num){
		this.num=num;
	}
	public void setNum(int num){
		this.num=num;
	}
	public int getNum(){
		return this.num;
	}
}
public class Hello {
	public static void main(String args[]){
		Demo demo=new Demo(100);
		fun(demo);
		System.out.println(demo.getNum());//30
	}
	public static void fun(Demo temp){
		temp.setNum(30);
	}
}

在这里插入图片描述
范例:第二道

public class Hello {
	public static void main(String args[]){
		String str="hello";
		fun(str);
		System.out.println(str);//hello
	}
	public static void fun(String temp){
		temp="world";
	}
}

字符串一旦声明就不可改变,字符串对象内容的改变依靠的是引用的改变实现的。
在这里插入图片描述
范例:第三道

class Demo{
	private String msg="Hello";
	public Demo(String msg){
		this.msg=msg;
	}
	public void setMsg(String msg){
		this.msg=msg;
	}
	public String getMsg(){
		return msg;
	}
}
public class Hello {
	public static void main(String args[]){
		Demo demo=new Demo("world");
		fun(demo);
		System.out.println(demo.getMsg());//MLDN
	}
	public static void fun(Demo temp){
		temp.setMsg("MLDN");
	}
}

两种分析模式:
第一种:把String当成基本数据类型那样分析
在这里插入图片描述
这样的描述严格来讲并不标准,毕竟String属于引用数据类型,所以应该按照严格的方式进行描述。
第二种:
在这里插入图片描述

总结

引用传递一定要耐心使用内存分析,String这种类型的数据需要特殊处理。

引用传递实例分析

描述这样一个程序:一个人有一辆车。
进行数据库设计时,要描述以上内容,数据表该如何设计:
在这里插入图片描述

如果现在需要进行类的设计,也需要两个类:Person、Car,就可以发现两者的关联:

  • 表名称=类名称;
  • 表的字段=类属性;
  • 表的一行记录=一个实例化对象;
  • 表的多行记录=对象数组;
  • 表的外键关系=引用设置。
    所以Java类的设计要与数据表一一对应。

范例:定义类

class Person{
	private int pid;
	private String name;
	//car为空,表示这个人没有车
	private Car car;//一个人有一辆车
	public Person(int pid,String name){
		this.pid=pid;
		this.name=name;
	}
	public String getPersonInfo(){
		return "编号:"+this.pid+",姓名:"+this.name;
	}
	public void setCar(Car car){
		this.car=car;
	}
	public Car getCar(){
		return this.car;
	}
}
class Car{
	private String Cname;
	//如果人有车了,必须同时修改人和车的关系
	private Person person;//一辆车属于一个人
	public Car(String cname){
		this.Cname=cname;
	}
	public void setPerson(Person person){
		this.person=person;
	}
	public Person getPerson(){
		return this.person;
	}
	public String getCarInfo(){
		return "汽车名称:"+this.Cname;
	}
}

此时程序使用了自定义类型,Person、Car都是类。随后进行代码测试。测试分两步:设置内容,取出内容。

public class Hello {
	public static void main(String args[]){
		//第一步:根据已有的结构设置内容
		Person per = new Person(1,"小胖");
		Car car=new Car("小皮卡");
		per.setCar(car);//人有车了
		car.setPerson(per);//车属于一个人类
		//第二步:根据关系取出数据
		System.out.println(per.getPersonInfo());
		System.out.println(per.getCar().getCarInfo());//代码链
		System.out.println(car.getPerson().getPersonInfo());
		System.out.println(car.getCarInfo());//代码链
		
	}
}

在这里插入图片描述
代码链要看每个方法的返回值是什么,如果是一个类的对象,则可以继续调用该类的方法。
也可以针对此代码进一步扩展。每个人有孩子,每个孩子也有车。实际上每个人的孩子一定是人,并且跟人具备同样的属性,那么就可以在Person设计一个孩子的属性。

class Person{
	private int pid;
	private String name;
	private Person child;//孩子
	//car为空,表示这个人没有车
	private Car car;//一个人有一辆车
	public Person(int pid,String name){
		this.pid=pid;
		this.name=name;
	}
	public void setChild(Person child){
		this.child=child;
	}
	public Person getChild(){
		return this.child;
	}
	public String getPersonInfo(){
		return "编号:"+this.pid+",姓名:"+this.name;
	}
	public void setCar(Car car){
		this.car=car;
	}
	public Car getCar(){
		return this.car;
	}
}
class Car{
	private String Cname;
	//如果人有车了,必须同时修改人和车的关系
	private Person person;//一辆车属于一个人
	public Car(String cname){
		this.Cname=cname;
	}
	public void setPerson(Person person){
		this.person=person;
	}
	public Person getPerson(){
		return this.person;
	}
	public String getCarInfo(){
		return "汽车名称:"+this.Cname;
	}
}
public class Hello {
	public static void main(String args[]){
		//第一步:根据已有的结构设置内容
		Person per = new Person(1,"小胖");
		Person chd = new Person(2,"小壮壮");
		Car c=new Car("碰碰车");
		Car car=new Car("小皮卡");
		per.setCar(car);//人有车了
		car.setPerson(per);//车属于一个人类
		per.setChild(chd);//一个人有一个孩子
		chd.setCar(c);//孩子有辆车
		//第二步:根据关系取出数据
		//找到一个人的孩子的信息
		System.out.println(per.getChild().getPersonInfo());
		//通过父亲的车找到父亲的信息,找到父亲的孩子的车的信息
		System.out.println(car.getPerson().getChild().getCar().getCarInfo());		
	}
}

在这里插入图片描述
引用的关系可以描述出不同类之间的引用关系。
在现实生活中,这样的设计实际上不麻烦。

总结

  • 不要把程序只当程序;
  • 引用传递除了进行数据的分析之外,还需要掌握类与类的联系使用;
  • 代码链的使用必须熟练。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
函数形参是函数定义中用于接收参数值的变量。通过函数形参,我们可以将外部的数据传递给函数,并在函数内部对这些数据进行处理和操作。 Python函数形参的用法可以有很多种,下面是一些实例分析: 1. 位置参数形参: 位置参数形参是最常见的形参类型,它根据参数在函数调用时的位置来确定传递给函数的值。例如: ```python def greet(name): print("Hello, " + name + "!") greet("Alice") ``` 输出结果为:Hello, Alice! 2. 默认参数形参: 默认参数形参是在函数定义时给形参指定默认值,当函数调用时没有传递对应的实参时,将使用默认值。例如: ```python def greet(name="World"): print("Hello, " + name + "!") greet() # 没有传递实参,使用默认值 greet("Alice") # 传递实参,使用传递的值 ``` 输出结果为: Hello, World! Hello, Alice! 3. 可变参数形参: 可变参数形参允许函数接受任意数量的实参。在函数定义时,可以使用 *args 来表示可变参数形参。例如: ```python def sum(*args): total = 0 for num in args: total += num return total result = sum(1, 2, 3, 4) print(result) ``` 输出结果为:10 4. 关键字参数形参: 关键字参数形参允许函数接受任意数量的以关键字参数形式传递的实参。在函数定义时,可以使用 **kwargs 来表示关键字参数形参。例如: ```python def greet(**kwargs): for key, value in kwargs.items(): print(key + ": " + value) greet(name="Alice", age="25") ``` 输出结果为: name: Alice age: 25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值