引用传递
引用传递的核心意义:同一块堆内存空间可以被不同的栈内存所指向,不同的栈内存可以对同一堆内存进行内容的修改。
一、三个程序分析
范例:
Class Message{
Private int num = 10;//基本数据类型(不包含string)不在堆内存中开辟空间。
Public Message(int num){
This.num = num;
}
Public void setnum(int num){
This.num = num;
}
Public int getnum(){
Return this.num;
}
}
Public class testdemo{
Public static void main(string arg[]){
Message mes = new Message(30);
Fun(msg);
System.out.println(msg.getnum);
}
Public static void fun(Message temp){
Temp.setnum(100);
}
}
输出结果:num = 100
内存分析:
范例二:
Public class testdemo{
Public static void main(string arg[]){
String msg = “hello”
Fun(msg);
System.out.println(msg);
}
Public static void fun(Stringe temp){
temp = “World” ;
}
}
输出结果:msg = hello ;
内存分析:
fun()方法调用结束之后,temp以及temp所指引的堆内存全部变为垃圾。
范例3 :
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 arg[]){
Message mes = new Message(30);
Fun(msg);
System.out.println(msg.getnum);
}
Public static void fun(Message temp){
Temp.setnum(100);
}
}
输出结果:info = world
内存分析:
结论:每一个String变量只能保存一个数据。
String类对象一旦声明则无法改变。对象内容的改变依靠的是引用地址的改变。
String类对象内容的改变:
如果说将一个对象传递回到类的方法里面,那么就相当于取消了封装,
可以通过对象访问属性。
程序:
class Info{
private String msg = "hello";
public void print(){
System.out.println("msg = "+msg);
}
//本类接收本类对象
public void fun(Info temp){
//在类的内部直接利用对象访问私有属性。实现String类内容的修改
// temp属于Info类,可以调用私有属性msg;
temp.msg= "world";
}
}
public class Testdemo{
public static void main(String args[]){
Info info = new Info();
info.fun();
info.print();
}
}
- 引用传递的实际运用
问题描述:每一个人都有一辆汽车或者没有汽车。要求可以通过面向对象的方式描述以上关系。
class Car{
private String pname;
private Member member;
public Car(String pname){
this.pname = pname;
}
public void setPname(){
this.pname = pname;
}
public String getPname(){
return pname;
}
public void setMember(Member member) {
this.member = member;
}
public Member getMember() {
return member;
}
public String getinfo(){
return "车名称:"+this.pname;
}
}
class Member{
private int num;
private String name;
private Car car;
private Member child;
public Member(int num,String name){
this.num = num;
this.name = name;
}
public void setNum(int num) {
this.num = num;
}
public void setName(String name) {
this.name = name;
}
public int getNum() {
return num;
}
public String getName() {
return name;
}
public void setCar(Car car) {
this.car = car;
}
public Car getCar() {
return car;
}
public void setChild(Member child) {
this.child = child;
}
public Member getChild() {
return child;
}
public String getinfo(){
return "人员编号:"+this.num+"、姓名"+this.name;
}
}
public class day02 {
public static void main(String args[]){
Member me = new Member(01,"柳旭");
Member chd = new Member(02,"铭铭");
Car c = new Car("宝马");
Car cc = new Car("奥拓");
me.setCar(c);//一个人有一辆车
c.setMember(me);//一辆车有一个车主人
chd.setCar(cc);//一个孩子有一辆车
cc.setMember(chd);//一辆车属于一个孩子
me.setChild(chd);//一个人有一个孩子
//人找车
//Member类中的gerCar()方法返回的是Car类型,所以能够调用Car类中的方法。
System.out.println(me.getCar().getinfo());
System.out.println(c.getMember().getinfo());//车找人
//通过人找到孩子的信息、
System.out.println(me.getChild().getinfo());
//通过人找到孩子车的信息 System.out.println(cc.getMember().getCar().getinfo());
}
}
引用传递为两个不同类型的类建立起了桥梁,实现了两个类的相互调用。