引用传递:

不同栈内存可以指向同一块堆内存,不同栈内存可以对一块堆内存进行修改

范例一:

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 class test1 {
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 test1 {
public static void main(String args[]) {
String msg = "hello";
fun(msg);//引用传递
System.out.println(msg);
}
public static void fun(String temp) {
temp = "world";
}
}//输出:hello

输出结果仍为hello,msg的值没有被改变

原因: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 test1 {
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

内存分析:

class Member {
private int mid;
private String name;
private Member child;
private Car car;
public Member(int mid, String name) {
this.mid = mid;
this.name = name;
}
public String getInfo() {
return "编号:"+this.mid+"\n"+
"名字"+this.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;
}
} class Car {
private Member member;
private String name;
public Car(String name) {
this.name = name;
}
public String getInfo() {
return "车的名字"+name;
}
public void setMember(Member member) {
this.member = member;
}
public Member getMember() {
return this.member;
}
} public class test1 {
public static void main(String args[]) {
Member m = new Member(1,"张三");
Member ch = new Member(2,"李四");
Car c = new Car("宝马");
Car cc = new Car("奔驰"); m.setCar(c);
c.setMember(m); ch.setCar(cc);
cc.setMember(ch);
m.setChild(ch); System.out.println(m.getCar().getInfo());
System.out.println(c.getMember().getInfo());
System.out.println(m.getChild().getCar().getInfo());
}
}

JAVA基础学习之路(十一)引用传递的更多相关文章

  1. JAVA基础学习之路(一)基本概念及运算符

    JAVA基础概念: PATH: path属于操作系统的属性,是系统用来搜寻可执行文件的路径 CALSSPATH: java程序解释类文件时加载文件的路径 注释: 单行注释  // 多行注释 /*... ...

  2. JAVA基础学习之路(六)数组与方法参数的传递

    通常,向方法中传递的都是基本数据类型,而向方法中传递数组时,就需要考虑内存的分配 public class test2 { public static void main(String args[]) ...

  3. JAVA基础学习之路(五)数组的定义及使用

    什么是数组:就是一堆相同类型的数据放一堆(一组相关变量的集合) 定义语法: 1.声明并开辟数组 数据类型 数组名[] = new 数据类型[长度]: 2.分布完成 声明数组:数据类型 数组名 [] = ...

  4. Java基础学习笔记二十一 多线程

    多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念.进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线 ...

  5. JAVA基础学习之路(十二)链表

    定义链表的基本结构: class Link {//外部类 //内部类,只为链表类服务 private class Node {//定义节点类 private String data;//保存的数据 p ...

  6. JAVA基础学习之路(八)[1]String类的基本特点

    String类的两种定义方式: 直接赋值 通过构造方法赋值 //直接赋值 public class test2 { public static void main(String args[]) { S ...

  7. JAVA基础学习之路(七)对象数组的定义及使用

    两种定义方式: 1.动态初始化: 定义并开辟数组:类名称 对象数组名[] = new 类名称[长度] 分布按成:类名称 对象数组名[] = null: 对象数组名 = new 类名称[长度]:   2 ...

  8. JAVA基础学习之路(四)定义简单java类

    简单java类开发一般原则: 类名称必须有意义,再怎么说,要让人家看的明白吧 类之中所有属性必须使用private封装,并提供setter,getter方法 类之中可以有多个构造方法,但是必须保留有一 ...

  9. JAVA基础学习之路(三)类定义及构造方法

    类的定义及使用 一,类的定义 class Book {//定义一个类 int price;//定义一个属性 int num; public static int getMonney(int price ...

随机推荐

  1. 阅读Deep Packet Inspection based Application-Aware Traffic Control for Software Defined Networks

    Deep Packet Inspection based Application-Aware Traffic Control for Software Defined Networks Globlec ...

  2. SwaggerUI用户手册

    SwaggerUI是一个非常好用的API文档工具,最关键的是他还能在工具内调试API,简直爽的不要不要的~网上针对开发者的文档非常多,但是给用户的手册却非常少.所以我来简单写个用户手册,供没有使用过s ...

  3. sharepoint搜索配置问题

    配置sharepoint 爬网内容源,如我们有4台前端服务器,集群域名为eds.jd.com,2台用于爬网前端服务器,集群域名为crawl.eds.jd.com 配置内容源的时候,将地址配为: 结果一 ...

  4. ZooKeeper系列(2)--基于ZooKeeper实现简单的配置中心

    ZooKeeper节点的类型分为以下几类:  1. 持久节点:节点创建后就一直存在,直到有删除操作来主动删除该节点 2. 临时节点:临时节点的生命周期和创建该节点的客户端会话绑定,即如果客户端会话失效 ...

  5. ORA-10485: Real-Time Query cannot be enabled while applying migration redo

    情景:利用Dataguard滚动方式升级数据库后,备库应用redo报错:ORA-10485 MRP0: Background Media Recovery terminated with error ...

  6. org.yaml.snakeyaml.parser.ParserException: while parsing a block mapping

    org.yaml.snakeyaml.parser.ParserException: while parsing a block mapping 原因:yml文件格式错误,此文件要求严格要求格式 如节 ...

  7. Docker安装(yum方式 centos7)

    yum install -y yum-utils device-mapper-persistent-data lvm2   yum-config-manager --add-repo http://m ...

  8. Delphi高效定制格式的FormatDateTime

    本人根据歼10博主的此博文的思路进行改进,目的是高效的实现FormatDateTime('YYYY-MM-DD HH:NN:SS.ZZZ', Now); 在DelphiXE3 32Bits环境测试10 ...

  9. 【非原创】Game23

    #include<stdio.h>int main(){ int n,m,x=0,flag=0; scanf("%d%d",&n,&m); x=m/n; ...

  10. Vim Go开发环境搭建

    基本搭建流程参考了网上的博文以及Vimgo的Github主页 博文https://www.cnblogs.com/breg/p/5386365.html Vim-go主页(我能不能加入项目,做点贡献呢 ...