一、引用传递

​引用传递是整个 java 的精髓所在

引用传递核心意义:同一块堆内存空间可以被不同的栈内存所指向,不同栈内存可以对同一块堆内存内容进行修改。

范例:第一道引用传递范例

class Message{
private int num = 10;
public Message(int num){
this.num = num;
}
public void setNum(int num){
this.num = num;
}
public int getNum(){return this.num;}
public int getInfo(){
return this.num;
}
} public class TestDemo{
public static void main(String args[]){
Message msg = new Message(30);
// 引用传递
fun(msg);
System.out.println(msg.getNum());
}
public static void fun(Message temp){
temp.setNum(100);
}
}

以上程序输出:100。

范例:第二道引用传递

public class TestDemo{
public static void main(String args[]){
String msg = "Hello";
// 引用传递
fun(msg);
System.out.println(msg);
}
public static void fun(String temp){
temp = "World";
}
}

​ 以上输出:Hello,题目只有一个解决思路:String 类对象内容一旦声明则不可改变,对象内容的改变依靠的是引用关系的变更。

范例:第三道引用传递

class Message{
private String info = "nihao";
public Message(String info){
this.info = info;
}
public void setInfo(String info){
this.info = info;
}
public String getInfo(){return this.info;}
} public class TestDemo{
public static void main(String args[]){
Message msg = new Message("Hello");
// 引用传递
fun(msg);
System.out.println(msg.getInfo());
} public static void fun(Message temp){
temp.setInfo("World");
}
}

​输出:World。但是以上的内存描述并不严格,因为在程序里,info 也是一个 String 类的对象。

结论:虽然 String 属于类,属于引用类型,但是由于其内容不可改变的特点,很多情况把 String 类型当成基本数据类型那样使用,也就是说:每一个 String 变量只能够保存一个数据。

总结:这三个引用范例算是一个小小的总结,也算是彻底阐述了 String 类的特点:不能改变。

二、引用传递实际应用

​假如说,每一个人都有一辆车或没有汽车。如果设计满足以上数据存储的数据库,应该设计两张表:汽车表和人员表。

​那么换回到程序思路,如果说现在想定义类,那么也应该定义两个类,所以通过分析可以发现以下的神奇规律:

简单 Java 类的编写原则:

  • 类名称 = 表名称;
  • 属性名称(类型) = 表字段(类型);
  • 一个实例化对象 = 一行记录;
  • 多个实例化对象(对象数组) = 多行记录;
  • 引用关系 = 外键约束。

范例:代码设计如下

class Member{
private int mid;
private String name;
}
class Car{
private String cname;
}

以上实现了两个独立的类,并且没有外键关系,但是在表中可以通过外键描述关系,那么在类之中可以采用引用描述这个关系

class Member{
private int mid;
private String name;
/* 表示属于人的车
如果 Car 有实例化对象则表示人有车;
如果 car 为 null 则表示人没有车。
*/
private Car car;
public String getInfo(){
return "编号:" + this.mid + ", 姓名:" + this.name;
}
}
class Car{
private String cname;
private Member member; // 车属于一个人
public Car(String name){
this.cname = name;
}
public String getInfo(){
return "汽车名字:" + this.cname;
}
}

一定要记住,Member 和 Car 应该都是一个独立的对象,而后通过产生对象发生关系。

当 Member 或 Car 类的对象产生之后,那么就应该为这两个对象设置彼此的关系。

class Member{
private int mid;
private String name;
/* 表示属于人的车
如果 Car 有实例化对象则表示人有车;
如果 car 为 null 则表示人没有车。
*/
private Car car;
public Member(int mid,String name){
this.mid = mid;
this.name = name;
}
public void setCar(Car car){
this.car = car;
}
public Car getCar(){
return this.car;
}
public String getInfo(){
return "编号:" + this.mid + ", 姓名:" + this.name;
}
}
class Car{
private String cname;
private Member member; // 车属于一个人
public Car(String name){
this.cname = name;
}
public void setMember(Member member){
this.member = member;
}
public Member getMember(){
return this.member;
}
public String getInfo(){
return "汽车名字:" + this.cname;
}
}
public class TestDemo{
public static void main(String args[]){
Member member = new Member(1,"King");
Car car = new Car("宝马");
member.setCar(car);
car.setMember(member);
System.out.println(member.getCar().getInfo());
System.out.println(car.getMember().getInfo());
}
}

以上的程序类完成之后,下面需要对程序进行测试,但是对程序的测试要求分两步:

  • 第一步:根据定义的结构关系设置数据;
  • 第二步:根据定义的结构关系取出数据。
public class TestDemo{
public static void main(String args[]){
// 第一步:设置数据
Member member = new Member(1,"King"); // 独立对象
Car car = new Car("宝马"); // 独立对象
member.setCar(car); // 一个人有一辆车
car.setMember(member); // 一辆车属于一个人
// 第二步:取出数据
System.out.println(member.getCar().getInfo()); // 通过人找到车的信息
System.out.println(car.getMember().getInfo()); // 通过车找到人的信息
}

下面进一步设计,例如:每个人都有自己的孩子,孩子还可能有车。

class Member{
private int mid;
private String name;
/* 表示属于人的车
如果 Car 有实例化对象则表示人有车;
如果 car 为 null 则表示人没有车。
*/
private Car car;
private Member child;
public Member(int mid,String name){
this.mid = mid;
this.name = name;
}
public void setCar(Car car){
this.car = car;
}
public Car getCar(){
return this.car;
}
public void setChild(Member child){
this.child = child;
}
public Member getChild(){
return this.child;
}
public String getInfo(){
return "编号:" + this.mid + ", 姓名:" + this.name;
}
} class Car{
private String cname;
private Member member; // 车属于一个人
public Car(String name){
this.cname = name;
}
public void setMember(Member member){
this.member = member;
}
public Member getMember(){
return this.member;
}
public String getInfo(){
return "汽车名字:" + this.cname;
}
} public class TestDemo{
public static void main(String args[]){
// 第一步:设置数据
Member member = new Member(1,"King"); // 独立对象
Car car = new Car("宝马"); // 独立对象
member.setCar(car); // 一个人有一辆车
car.setMember(member); // 一辆车属于一个人 Member child = new Member(2,"KAlice"); //一个孩子
Car carc = new Car("法拉利"); // 一辆车
member.setChild(child); // 一个人有一个孩子
child.setCar(carc); // 一个孩子有一辆车
carc.setMember(child); // 一辆车属于一个人
// 第二步:取出数据
System.out.println(member.getCar().getInfo()); // 通过人找到车的信息
System.out.println(car.getMember().getInfo()); // 通过车找到人的信息
System.out.println(member.getChild().getInfo()); // 通过人找到孩子的信息;
System.out.println(member.getChild().getCar().getInfo()); // 通过人找到孩子的车子信息;
}
}

现实中这样的操作其实很常见:一个人有一间房子、一个人有一张身份证、一个人有一个驾照......

还可以针对引用做进一步的描述,例如:要求描电脑,电脑由主机、显示器、键盘、CPU、鼠标、内存、硬盘、显卡组成。那么现在怎么通过代码描述呢?

以下是伪代码

class 键盘{}
class 鼠标{}
class 硬盘{}
class 显示器{}
class 主板{}
class 主机{
private 硬盘 对象[];
private CPU 对象[];
private 主板 对象;
private 内存 对象[];
}
class 电脑{
private 主机 对象;
private 显示器 对象[];
private 鼠标 对象;
}

这样的设计思路在 Java 之中称为合成设计模式。合成设计的关键:占着各自对象类型。

【8】java之引用传递的更多相关文章

  1. Java Object 引用传递和值传递

    Java Object 引用传递和值传递 @author ixenos Java没有引用传递: 除了在将参数传递给方法(或函数)的时候是"值传递",传递对象引用的副本,在任何用&q ...

  2. Java参数引用传递之例外:null

    今天写链表的时候写了一个函数,实参是一个空链表,应该是按引用传参,但是在函数内修改了链表,外部的链表没有变化. 原来是null作为参数传递的时候,就不是引用传参了. 引自:http://blog.cs ...

  3. Java没有引用传递机制,C#有。

    Java没有引用传递机制,C#有: public class Obj { private Integer myValue; public Integer getMyValue() { return m ...

  4. Java中引用传递

    //Java中的引用传递 class Ref1{ int temp = 10 ; String Str = "hello"; } public class HelloWorld { ...

  5. 有关java的引用传递,直接操作对象本身。直接删除BE的value中某值

    HashSet<String> refRegions = BE.get(regionName);    HashSet<String> values = new HashSet ...

  6. java中 引用传递、值传递的理解(数组,自定义类,基本数据类型,String类)

    代码部分: public static void main(String[] args) { testInt(); testString(); testArray(); testX(); } publ ...

  7. 如何理解java的引用传递

    1. 数组的引用传递 public class TestArray { public static void changeAry1(int[] ary){ int[] ary1 = {9,9,9}; ...

  8. (转)java中引用传递和值传递

    https://blog.csdn.net/javazejian/article/details/51192130 https://www.cnblogs.com/perfy/archive/2012 ...

  9. java的引用传递

    public class T{ static class Node{ int value; Node left = null; Node right = null; public Node(int v ...

  10. Java中的引用传递和值传递

    Java中的引用传递和值传递 关于Java的引用传递和值传递,在听了老师讲解后,还是没有弄清楚是怎么一回事,于是查了资料,所以在这里与大家分享,有不对的地方,欢迎大家留言. java中是没有指针的,j ...

随机推荐

  1. ARL灯塔系统搭建

    前言 ARL(Asset Reconnaissance Lighthouse)资产侦查灯塔,是一个良好的资产收集系统,旨在为渗透测试人员以及安全团队基于企业的网络安全能快速查找到指定企业资产中的脆弱点 ...

  2. 第二章 --------------------XAML基础

    1.XAML是什么? XAML是扩展标记语言,是为了方便设计人员设计UI界面.具体关于XAML语法的讲解参考其他相关书籍.  XAML每一个标签以<>开头,以</>结尾,作为标 ...

  3. Java开发学习(五十)----MyBatisPlus快速开发之代码生成器解析

    1.代码生成器原理分析 造句: 我们可以往空白内容进行填词造句,比如: 在比如: 观察我们之前写的代码,会发现其中也会有很多重复内容,比如: 那我们就想,如果我想做一个Book模块的开发,是不是只需要 ...

  4. 我的第一个自动刷作业脚本(大起大落的selenium经验分享)

    起因 故事的开始是大二的上学期,有一门叫计算机结构(computer organization)的课.新教授这门课的教授在原来的政策上做了一些变动.他引入了一个叫做zybook的作业平台来确保我们能跟 ...

  5. CLISP学习(一)

    Lisp Lisp发表于1960,是由数学家约翰·麦卡锡发明的. 在计算机有所发展时,数学家们对人工智能有着极大的兴趣,觉得可以实现一个共通的方法,使计算机能够处理链表中的符号数据,允许语言的处理.信 ...

  6. CSS中知

    1CSS特性    1.3优先级    1.4权重叠加计算 2Chrome调试工具     2.1查错流程 3CSS盒子模型    3.1内容的宽度和高度    3.2边框(border)-连写形式 ...

  7. SICTF_wp

    misc 签到打卡完成 附加下载完成之后可以看到是qsnctf的公众号 使用010打开附件 可以发现key,去公众号回复key即可获得flag SICTF{fb23cefd-487f-42dd-a34 ...

  8. 经典问题 1 —— DAG 上区间限制拓扑序

    问题描述 给定一个 DAG,求一个拓扑序,使得节点 \(i\) 的拓扑序 \(\in [l_i,r_i]\). 题解 首先进行一个预处理:对于所有 \(u\),令 \(\forall (v,u)\in ...

  9. java入门与进阶-P1.3+P1.4

    准备一个java编程软件 eclipse官网: Enabling Open Innovation & Collaboration | The Eclipse Foundation 他是一个免费 ...

  10. 包子类&包子铺类-吃货类&测试类

    包子类&包子铺类 资源类:包子类设置包子的属性皮陷包子的状态:有true,没有false package Demo01.WaitAndNotify; /** * 资源类:包子类设置包子的属性 ...