引用传递
核心意义:同一块堆内存空间可以被不同的栈内存所指向,而不同的栈内存可以对同一堆内存空间的内容进行修改
1.标准的引用传递范例
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 TestDemo{
public static void main(String args[]){
Message msg=new Message(30); //实例化Message类对象同时传递num属性内容
fun(msg); //引用传递
System.out.println(msg);
}
public static void fun(Message temp){
temp.setNum(100); //修改num属性内容
}
}
程序执行结果:100
2.String类对象的引用传递
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类的对象引用传递中,字符串的内容一旦被实例化是不可改变的,它是通过改变引用来实现的。
从上面的程序可以看出,msg的内容没有发生变化,是因为所有的变化都是在fun方法中发生的,随着fun方法的结束,temp就会失效,其所对应的堆内存也变成了垃圾。
3.综合范例
class Message{
private String info="无用内容";
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"); //实例化Message类对象
fun(msg); //引用传递
System.out.println(msg.getInfo()); //调用get方法输出info属性内容
}
public static void fun(Message temp){
temp.setInfo("World"); //修改info属性内容
}
}
程序执行结果:World
4.实际应用
——设计一个人和车的简单Java类程序。
class Member{
private int id; //人员编号
private String name; //人员姓名
private Car car; //表示人的车
private Member child; //表示人的孩子
public Member(int id,String name,){
this.id=id;
this.name=name;
}
public void setCar(Car car){
this.car=car;
}
public Car getCar(){
return this.car;
}
public void setChild(Member member){
this.member.member;
}
public Member getChild(){
return this.child;
}
public String getInfo(){
return "人员编号:"+this.id+",人员姓名:"+this.name;
}
}
class Car{
private String cname; //车的名字
private Member member; //车的所有者
public Car(String cname){
this.cname=cname;
}
public void setMember(Member member){
this.member=member;
}
public Member getMember(){
return this.member;
}
public String getInfo(){
return "车的名字:"+cname;
}
}
public class TestDemo{
public static void main(String args[]){
//第一步:根据结构设置属性
Member me=new Member(101,"刘雯");
Member mc=new Member(102,"刘欢");
Car ca=new Car("英菲尼迪");
Car cb=new Car("保时捷911");
me.setCar(ca); //一个人有一辆车
ca.setMember(me); //一辆车属于一个人
mc.setCar(cb); //一个孩子有一辆车
cb.setMember(mc); //一辆车属于一个孩子
me.setChild(mc); //一个人有一个孩子
//第二步:根据结构取出属性
System.out.println(ca.getMember().getInfo()); //通过车找到人的信息
System.out.println(me.getCar().getInfo()); //通过人找到车的信息
System.out.println(me.getChild().getInfo()); //通过人找到孩子的信息
System.out.println(me.getChild().getCar().getInfo()); //通过人找到孩子车的信息
}
}
程序执行结果:人员编号:101,人员姓名:刘雯
车的名字:英菲尼迪
人员编号:102,人员姓名:刘欢
车的名字:保时捷911
以上的程序是从两张数据表中映射过来的,程序设计原则如下:
- 类名称=表名称
- 属性名称(类型)=表中字段(类型)
- 一个实例化对象=表中一行记录
- 多个实例化对象(对象数组)=多行记录
- 引用关系=外键约束
在这里对于数据表与简单JAVA类的映射做了简单说明,关于更进一步的内容(一对多、多对多等)在后面的博客中说明。
表1:
Member |
---|
id(人员编号):nt |
name(人员姓名):String |
car(车的名字):Car |
表2:
Car |
---|
cname(车的名字):String |
member(车的主人):Member |
以上内容为自己的浅解,欢迎广大读者指正,如果对你有所帮助,请添加关注,以后会有更多的作品奉上。