美文网首页
Java引用传递进阶分析

Java引用传递进阶分析

作者: 南在南方i | 来源:发表于2020-02-17 14:19 被阅读0次

    Java引用传递进阶分析

    我们通过几个例子与内存关系图进一步的分析Java的引用传递

    例一

    代码如下:

    class Demo{
        private int num;
    
        public Demo(int num){
            this.num = num;
        }
    
        public void setNum(int num) {
            this.num = num;
        }
    
        public int getNum() {
            return num;
        }
    }
    
    public class MyClass {
        public static void main(String[] args) {
            Demo demo = new Demo(100);
            fun(demo);
            System.out.println(demo.getNum());
        }
        public static void fun(Demo temp){
            temp.setNum(30);
        }
    }
    

    内存关系图如下:

    内存关系图

    例二

    代码如下:

    public class MyClass {
        public static void main(String[] args) {
            String str = "hello";
            fun(str);
            System.out.println(str);
        }
        public static void fun(String temp){
            temp = "world";
        }
    }
    

    内存关系图如下:

    内存关系图

    例三

    代码如下:

    class Demo {
        private String str;
    
        public Demo(String str) {
            this.str = str;
        }
    
        public void setStr(String str) {
            this.str = str;
        }
    
        public String getStr() {
            return str;
        }
    }
    
    public class MyClass {
        public static void main(String[] args) {
            Demo demo = new Demo("hello");
            fun(demo);
            System.out.println(demo.getStr());
        }
        public static void fun(Demo temp){
            temp.setStr("world");
        }
    }
    

    内存关系图如下:

    内存关系图
    引用传递一定要耐心使用内存分析,String这种类型的数据需要特殊处理

    对象比较

    所谓的对象比较指的就是可以判断两个对象是否相等。实际上现在对象是否相等只能够依靠地址是否相同,但有些时候可能会出现地址不相同,但是内容相同的情况,就好String类中的“==”与“equals()”的关系

    因此,首先要做的事情就是必须将两个对象中的每一个属性内容分别比较,如果全部相同那么就表示同一个对象

    代码如下:

    class Person{
        private String name;
        private int age;
    
        public Person(String name,int age){
            this.name = name;
            this.age = age;
        }
    
        public boolean compare(Person person){
            if (person == null){//没有人时返回false
                return false;
            }
            if (this == person){//对象时自己时返回false
                return false;
            }
            if (this.name.equals(person.name) && this.age == person.age){
                //进行判断
                return true;
            }
            return false;
        }
    }
    
    
    public class MyClass {
        public static void main(String[] args) {
            Person perA = new Person("张三",20);
            Person perB = new Person("张三",20);
            if (perA.compare(perB) == true){
                System.out.println("这是同一个人!");
            }else {
                System.out.println("这是不同的人!");
            }
        }
    }
    

    引用传递实际应用

    程序是生活的浓缩,是生活的抽象,因此日常生活中的一切概念都可以用程序去描述,那么下面描述这样一个程序:一个人有一辆车

    代码如下:

    class Person{
        private int pid;
        private String name;
        private Car car;//一个人有一辆车
    
        public Person(int pid,String name){
            this.pid = pid;
            this.name = name;
        }
    
        public String getPersonInfo(){
            return "姓名:"+this.name+",编号:"+this.pid;
        }
    
        public void setCar(Car car) {
            this.car = car;
        }
    
        public Car getCar() {
            return car;
        }
    }
    
    class Car{
        private String cname;
        private Person person;//一辆车有一个人
    
        public Car(String cname){
            this.cname = cname;
        }
    
        public String getCarInfo(){
            return "车辆品种:"+this.cname;
        }
    
        public void setPerson(Person person) {
            this.person = person;
        }
    
        public Person getPerson() {
            return person;
        }
    }
    
    public class MyClass {
        public static void main(String[] args) {
            Person person = new Person(15,"张三");
            Car car = new Car("法拉利");
            person.setCar(car);
            car.setPerson(person);
            System.out.println(person.getPersonInfo());
            System.out.println(person.getCar().getCarInfo());
        }
    }
    

    引用的关系可以描述出不同类之间的引用关系,理论上任何的事物都可以进行这样的整合

    相关文章

      网友评论

          本文标题:Java引用传递进阶分析

          本文链接:https://www.haomeiwen.com/subject/krlpfhtx.html