java如何进行进行对象传递???

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java如何进行进行对象传递???相关的知识,希望对你有一定的参考价值。

public class A ----------- A.java文件
public class B ------------B.java文件
A和B要共用一个对象,比如A a = new A();现在B要用这个a,我用了下面的方法都无法实现:
方法1. A中设定一个全局变量(public A aa;)在A文件中:
A a =new A();
把这个a对象值赋给全局变量aa(或者直接赋值,或者用函数参数传递赋值(a.setA(A a))))
然后在B文件中:
A a' = new A();
a'.aa或者a'.getA()(),得到A文件创建的那个a对象。
结果:B文件中的a' =null,报异常,也就是对象a没有传递过来。
方法2.
将a对象序列化然后输到流中,用readObject()和writeObject()操作,通过流的读写进行。但是我的项目中,有个引用的java类(jdk中的类import了进来)没有实现Serializable接口,这样的话采用对象序列化是行不通的。
问题:除了这两个方法,还有什么办法把对象传过去??
(我的项目中有socket操作)
这是一个100多个java文件的项目,要是类随便可以移动,就不用在这里问了。还有别的方法吗?谢谢!

谢谢!!huxunxu
-----------我理解你的意思,A要拿到B的对象,那么把B对象作为参数传给A去初始化一个A的对象。
但是我这里的情况是A在服务器端运行,B在客户端运行,客户端创建对象,发送消息socket给服务器端B,B如何才能拿到A客户端创建的对象?

参考技术A 你所说的“B文件中的a' =null,报异常,”
不能说明“a没有传递过来”而是B文件中:
A a' = new A();“ a' ” 对象就没有创建成功。
解决方法:你可将 A文件中的public A aa;“aa”设置成静态(static)的。
参考技术B 晕,用extends不行吗?public class a()extends b
要不就用this 和super咯。例如 super。a=0
参考技术C 把class B写在class A里面,当作内部类使用 参考技术D //代码给你写了 你看吧
public class A
private B b;
A(B b)
this.b = b;

public void printB()
System.out.println(b);

public static void main(String args[])
B b = new B();
A a = new A(b);
a.printB();



class B

思考java中core属性的特殊值,如何传递到底是值ins中的类目,全解答过程

  • 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
  • 引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
 值传递引用传递
根本区别 会创建副本(Copy) 不创建副本,直接引用
效果 函数中无法改变原始对象 函数中可以改变原始对象

Java 中的实参与形参之间的传递到底是值传递还是引用传递呢?

其实之前我和大多数人一样认为:传递的参数如果是“基本数据类型”,那就是“值传递”,如果是“引用类型”(即 对象),那就是“引用传递”。

但是昨天我突然觉得:好像。。。不一定!
诶,别急着怼我说:Nemo!你传递过对象没啊,把对象传过去,修改对象的属性值,属性值就是的的确确的修改了啊!

诶,你说的没错,确实是修改了,但是你也说了是修改对象的属性值,传过去的是对象地址,而你的实际操作并没有对你传入的地址进行修改,只是修改了对象地址下面的属性值。

如果只是修改对象地址下面的属性值的话,那么值传递和引用传递有差吗?
值传递:复制对象地址给函数,函数修改对象地址下面的属性值。
引用传递:引用对象地址给函数,函数修改对象地址下面的属性值。
这两者有差吗,无论是复制还是引用,传入的对象地址都没有改变,改变的只是对象地址下面的属性值。

类比:我们可以类比一下,你家的地址是“北京市海淀区清华园1号”
引用传递:你给我引用你的地址,我过去你的地址那,打开你家的门,偷你家电动车的电瓶。
值传递:你不给我你的地址,我从网上找到你的地址,复制一份,过去你的地址那,打开你家的门,偷你家电动车的电瓶。
你瞧瞧,这两者有差吗?无论是怎样拿到你家的地址,你家的电瓶我要定了啊,你家的电瓶都会被修改啊。

举例代码:

package temp;

/**
 * @author Nemo
 * @date 2020/6/22
 */
public class ValueTransfer {
    public static void main(String[] args) {
        Home yourHome = new Home("你的家");
        Nemo nemo = new Nemo();
        nemo.steal(yourHome);
        yourHome.show();
    }
}

class Home {
    public String name;
    public boolean battery = true;

    public boolean isBattery() {
        return battery;
    }

    public void setBattery(boolean battery) {
        this.battery = battery;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Home(String name) {
        this.name = name;
    }

    public void show() {
        if (this.isBattery()) {
            System.out.println(name + "的电瓶还在哟~");
        } else {
            System.out.println(name + "的电瓶被偷了!");
        }
    }

}

class Nemo {
    public void steal(Home home) {
        //如果是引用传递的话,那么我把你的家整个都变为了别人的家,那么你的家对象上现在应该存放的是别人的家
        //如果是值传递的话,那么我只是把你的家对象复制了一个新的,这个新的家是别人的家,我偷一个跟你家一模一样的别人家的电瓶,你家的电瓶应该不会变
        home = new Home("别人的家");
        home.battery = false;
        home.show();
    }

}

在 Nemo 类的 steal 方法中,我们可以看到注释:

  1. 如果是引用传递,那么我把你的家整个都变为了别人的家,那么你的家对象上现在应该存放的是别人的家,并且你家(即 别人家)的电瓶也应该被我偷了。
  2. 如果是值传递,那么我只是把你的家对象参数复制了一个新的,这个新的家我设为了别人的家,我偷一个跟你家一模一样的别人家的电瓶,你家的电瓶应该不会变。

运行结果:

别人的家的电瓶被偷了!
你的家的电瓶还在哟~

根据运行结果来看,很显然,是第二种情况,也就是值传递,我偷的是一个跟你家一模一样的别人家的电瓶,而你家的电瓶还在。

结论

Java 中只有值传递

以上是关于java如何进行进行对象传递???的主要内容,如果未能解决你的问题,请参考以下文章

对象的传递为啥要 序列化 呢

Java基础之OOP

Android 如何进行页面传递对象

java 值传递 数组传递

自定义Encoder/Decoder进行对象传递

Java方法中传递数组与改变数组值的问题