10.引用传递

版权声明:原创文章,转载请声明原处 https://blog.csdn.net/qq_41723615/article/details/86237038

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

范例:引用传递

//引用传递
class Message{
    private int num=10;
    public Message(int num){
        this.num=num;
    }
    public void setNum(int num){
        this.num=num;
    }
    public void getNum(int num){
       return this.num;
    }
}
public class ByRefTest{
    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);
    }
}

本程序首先在Message类中只定义了一个num属性( int为基本数据类型),然后利用Message类的构
造方法进行num属性的赋值操作,最后在主方法中调用了fun()方法,在fun()方法的参数上接收了Message
类对象的引用,以便可以修改num属性的内容。而当fun()方法执行完毕后temp断开与堆内存的引用,但是
对于堆内存的修改却保存了下来,所以最终的结果是1000;

第一道引用范例是一个标准的引用传递操作,即不同的钱内存指向了同一块堆内存空间,但是在进
行引用分析中不得不去考虑一种特殊的类一String类。

public class TestDemo{
    public static void main(String args[]){
        String msg="hello";  //定义String对象
        fun(msg);//引用传递
        System.out.println(msg);//输出msg对象内容
    }
    public static void fun(String temp){//接收字符串引用
        temp="word";//改变字符串引用
    }
}

范例:引用传递的实际引用

class Member{
    private int mid;
    private String name;
    private Member child; //表示孩子
    //car有实例化对象表示有车
    //car为null表示没有车
    private Car car;  //表示属于人的车
    public Member (int mid,String name){
        this.mid=mid;
        this.name=name;
    }
    public String getInfo(){
        return"人员编号:"+this.mid+",姓名:"+this.name;
      
    }
    public void setChild(Member child){
         this.child=child;
    }
    public Member getChild(){
         return this.child; 
    }

    public void setCar(Car car){
      this.car=car;
    }
    public Car getCar(){
       return this.car;
    }
}
class Car{
    private Member member; //车属于一个人
    private String pname;
    public Car(String pname){
       this.pname=pname;
    }
    public String getInfo(){
        return"车的名字:"+this.pname;
    }
    public void setMember(Member member){
         this.member=member;
    }
    public Member getMember(){
         return this.member;
    }
}
public class ByRefTest1{
    public static void main(String args[]){ 
          //第一步:设置数据
        Member m=new Member(1,"陈冠佑");  //独立对象
        Member chd=new Member(2,"陈冠希");  //一个孩子
        Car c=new Car("宝马320Li");    //独立对象
        Car cc=new Car("法拉利");
        m.setCar(c);     //一个人有一辆车
        c.setMember();    //一辆车属于一个人
        chd.setCar();  //一个孩子有一辆车
        cc.setMember(chd); //一辆车属于一个孩子
        m.setChild(chd); //一个人有一个孩子
        //第二步:取出关系
        //通过人找到车的信息
        System.out.println(m.getCar().getInfo());
        //通过车找到人的信息
        System.out.println(c.getMember().getInfo());
        //通过人找到他孩子的信息
        System.out.println(m.getChild().getInfo());
        //通过人找到他孩子的车的信息
        System.out.println(m.getChild().getCar().getInfo());
    }
}

简单Java类的设计原则:

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

第一步:根据定义的结构关系设置数据;

第二步:根据定义的结构关系取出数据。

本程序在Member类中增加了一个表示孩子的属性“child” ;其类型为Member类型, 如果一个人
有孩子则为其设置一个实例化对象, 如果没有则设置为null。特别需要注意的是, 在通过人找到孩子所
对应车的信息时使用了代码链的形式“m.getChild().getCar().getlnfo” ,这类代码一定要观察每一个方法
的返回值, 如果返回的是一个类的引用, 则可以继续调用这个类的方法, 而此类代码在以后的开发中也
一定会出现。

 

猜你喜欢

转载自blog.csdn.net/qq_41723615/article/details/86237038
10.
今日推荐