一、引用传递

​引用传递是整个 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. 【FAQ】在华为鸿蒙车机上集成华为帐号的常见问题总结

    随着新一代信息技术与汽车产业的深度融合,智能网联汽车正逐渐成为汽车产业发展的战略制高点,无论是传统车企还是新势力都瞄准了"智能座舱"这种新一代人机交互方式.面对竞争如此激烈的车机市 ...

  2. Ubuntu:Docker启动与停止

    安装完成Docker后,默认已经启动了docker服务,如需手动控制docker服务的启停,可执行如下命令 启动docker sudo service docker start 停止docker su ...

  3. 增强MybatisPlus拓展新功能 实战MybatisPlus大合集

    mybatis-plus-max简介 MybatisPlusMax是MybatisPlus的增强包,秉承只拓展不修改的理念,对MybatisPlus做增强. 正如MybatisPlus是对MyBati ...

  4. dfs 返回值用bool相对void会快一点

    力扣 剑指 Offer 12. 矩阵中的路径 超时代码 dfs返回值是void,用类内的全局变量flag表示找到或没找到. class Solution { public: bool flag; in ...

  5. 超详细解锁Webpack步骤,踩坑记录

    webpack 核心 entry: 入口 output: 输出 loader: 模块转换器,用于把模块原内容按照需求转换成新内容 插件(plugins): 扩展插件,在webpack构建流程中的特定时 ...

  6. djiango框架推导过程,jinja2模板语法,jiango简介,基本操作命令

    djiango框架推导过程,jinja2模板语法,jiango简介,基本操作命令 一.web框架前戏 web 框架可以理解为是基于会联网的web服务端>>>socket服务端 1.w ...

  7. 【学习笔记】C/C++ 设计模式 - 模板模式

    介绍说明 模板设计模式是一种非常简单的设计模式,其主要是利用了虚函数的特性实现.非常适合应用在一些算法.流程.业务逻辑是固定的形式,其中某些步骤的实现方式又无法确定下来的场景. 举例说明 以下为模拟某 ...

  8. 文献阅读01:由I类HLA转录缺失导致的联合免疫治疗的获得性癌症耐药性

    背景 Merkel cell carcinoma:梅克尔细胞癌又名皮肤小梁状癌.原发性皮肤神经内分泌癌.皮肤原发性小细胞癌及皮肤APUD瘤. HLA:MHC基因产物在不同细胞表面表达,通常称之为MHC ...

  9. Python内置对象(一)

    Python内置对象(一) 分多次讲解 这部分相对比较简单,偶尔一些特殊的做法会强调下(前面加★) 总览 builtins = [_ for _ in dir(__builtins__) if not ...

  10. Vue17 手机表单数据

    1)v-model.trim trim修饰符是去掉前后空格 2)type="number" v-model.number type="number":只能输入数 ...