紫薇星上的Java——引用传递

在Java中,可以创建使用多个类,但这多个类如何实现相互引用?如何使A类中的对象在B类中被引用,在C类中显示打印?这个时候我们就要了解对象与类的关系以及类之间的引用传递关系。


1.类关联结构

引用传递是整个Java开发与设计过程中最为重要的技术组成。

假设现在有一个实际的问题,现实生活中总会有人有车而有的人没有车,那么一个人买了一辆车,这个人可作为一个对象,这辆车也可作为一个对象,这两个对象分别创建非常简单,如下:

class Car{
	private String name;
	private double price;
	public Car(String name, double price) {
		this.name = name;
		this.price = price;
	}
	public String getInfo() {
		return "name:" + this.name + "、price:" + this.price;
	}
}

class Person{
	private String name;
	private double age;
	public Person(String name, double age) {
		this.name = name;
		this.age = age;
	}
	public String getInfo() {
		return "name:" + this.name + "、age:" + this.age;
	}
}

public class first {
	public static void main( String args[] ){
		Person person = new Person("紫郡", 19);
		Car car = new Car("宾利",1800516.213);
		System.out.println(car.getInfo());
		System.out.println(person.getInfo());
	}
}

我们很容易实现创建两个对象并实例化,这里为了简化代码方便阅读,人和车只有姓名和年龄,品牌与价值。那么怎样将这两个对象关联起来?现在这两个对象是独立的,我们可以删掉任意一个人的对象或者车的对象,对另一个对象不会造成影响。那么我们要展示“紫郡”这个人有一辆“宾利”,应该如何写代码?

很简单,我们需要给人这个对象一个属性:车,这样子就可以实现实例化一个有车的人,或者一个没有车的人;同时给车一个属性:人,这样子对一个车的对象来说,就可以实现实例化一辆有归属的车,或者一辆没有归属的车。如下:

class Car{
	private String name;
	private double price;
	private Person person;
	public Car(String name, double price) {
		this.name = name;
		this.price = price;
	}
	public Person getPerson() {
		return this.person;
	}
	public void setPerson(Person person) {
		this.person = person;
	}
	public String getInfo() {
		return "name:" + this.name + "、price:" + this.price;
	}
}

class Person{
	private String name;
	private double age;
	private Car car;
	public Person(String name, double age) {
		this.name = name;
		this.age = age;
	}
	public Car getCar() {
		return this.car;
	}
	public void setCar(Car car) {
		this.car = car;
	}
	public String getInfo() {
		return "name:" + this.name + "、age:" + this.age;
	}
}

上述代码中的set与get方法我相信大家都不陌生,用过它们来访问对象的变量,当我们写好这些后,现在的Person类与Car()类就是我们所说的一个人是否拥有车一辆车是否有归属。在main()函数中我们进行如下编写:

public class first {
	public static void main( String args[] ){
		Person person = new Person("紫郡", 19);
		Car car = new Car("宾利",1800516.213);
		person.setCar(car);
		car.setPerson(person);
		System.out.println(person.getCar().getInfo());
		System.out.println(car.getPerson().getInfo());
	}
}

当上述编写完成后,运行程序,结果如下:

name:宾利、price:1800516.213
name:紫郡、age:19.0

上述代码中如System.out.println(person.getCar().getInfo());这种形式称为代码链,而整个代码形式就是引用传递,通过这种形式就可以将所有有关联的类与对象关联起来。

2.自身关联

当我们能够关联人与车的关系的时候,那么我们就可以讨论下列问题:人如果有孩子怎么办?孩子如果有车怎么办?这两个问题很好的展示了自身引用关联与自身引用关联其他类的结果。

首先,孩子也是人的一个对象,所以他属于Person类,但孩子也是人生的,与人的关系也是是否拥有,所以我们将它作为一个属性给Person类:

class Person{
	private String name;
	private double age;
	private Car car;
	private Person children [];//注意这里是个数组
	public Person(String name, double age) {
		this.name = name;
		this.age = age;
	}
	public Person[] getChildren() {
		return this.children;
	}
	public void setChildren(Person[] children) {
		this.children = children;
	}
	public Car getCar() {
		return this.car;
	}
	public void setCar(Car car) {
		this.car = car;
	}
	public String getInfo() {
		return "name:" + this.name + "、age:" + this.age;
	}
}

那么我们就可以实例化孩子,同时因为child也是Person,所以也可以拥有车:

public class first {
	public static void main( String args[] ){
		Person person = new Person("紫郡", 19);
		Car car = new Car("宾利",1800516.213);
		Person childA = new Person("紫薇一号", 3);
		Person childB = new Person("紫薇二号", 2);
		person.setCar(car);
		childA.setCar(new Car("小火三轮", 1800));//匿名对象
		childB.setCar(new Car("小滑板", 1500));
		//car.setPerson(person);
		System.out.println(person.getCar().getInfo());
		//System.out.println(car.getPerson().getInfo());
	}
}

这里可以注意到,我们给孩子setCar时使用了匿名对象,这样就节省了内存空间,也方便代码阅读。

我们需要建立child与person之间的关系,使用下面这行代码就可以:

person.setChildren(new Person [] {childA, childB});

那么接下来问题来了,我们要如何展示child与person之间的关系?如何展示child的车?因为children是一个数组,所以我们只需要使用for循环将数组内容用length函数来打印出来,再使用getInfo()函数打印信息,就可以实现:

public class first {
	public static void main( String args[] ){
		Person person = new Person("紫郡", 19);
		Car car = new Car("宾利",1800516.213);
		Person childA = new Person("紫薇一号", 3);
		Person childB = new Person("紫薇二号", 2);
		person.setCar(car);
		person.setChildren(new Person [] {childA, childB});
		childA.setCar(new Car("小火三轮", 1800));//匿名对象
		childB.setCar(new Car("小滑板", 1500));
		//car.setPerson(person);
		System.out.println(person.getCar().getInfo());
		//System.out.println(car.getPerson().getInfo());
		for(int i = 0; i < person.getChildren().length; i++) {
			System.out.println("\t|-" + person.getChildren()[i].getInfo());
			System.out.println("\t\t|-" + person.getChildren()[i].getCar().getInfo());
		}
	}
}

我们将person的child使用for循环打印出来,同时使用上一节的引用传递代码链,就可以将child与person的关系以及拥有的car一起打印出来,结果如下:

name:宾利、price:1800516.213
	|-name:紫薇一号、age:3.0
		|-name:小火三轮、price:1800.0
	|-name:紫薇二号、age:2.0
		|-name:小滑板、price:1500.0

这就是一个简单的自身关联与类关联,在以后的开发中会经常使用这种形式,比如设计一个公司人员管理的系统,每个人都有一个上司、每个人都有一个部门、每个人都有一个职称、每个人都有自己的工资和工作内容,每个人作为一个对象时都有很多的与之关联的类与对象,所以在实际开发中,引用传递是一种很实用的方式。


引用传递是一种非常实用的技术,这部分简单的说了下引用传递的概念和使用方法,我们下次见👋

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值