Tag: pass by reference

为什么java RMI无法通过引用获得返回值

在RMI中,我只能获得返回值 InetSocketAddress address = new InetSocketAddress(hostname, port); Server server = Stub.create(Server.class, address); int return = server.getValue(); 但是,我无法得到它 public class Return { int value; } InetSocketAddress address = new InetSocketAddress(hostname, port); Server server = Stub.create(Server.class, address); Return return = new Return(); server.getValue(return); 我知道参数将被序列化和反序列化,但这不是我的问题,我的问题是“为什么Java不能模拟传入引用作为传入in-out,就像在C中使用RPC一样?”,I认为它与java环境有关。 通过in-out我的意思是在C中使用RPC,你可以获得返回值 int return; rpc.getValue(&return); 希望现在我的问题很明确。

在这种情况下何时会在我的类实例上调用finalize()?

我知道每当垃圾收集器收集一个类实例时都会调用finalize()。 但是,当通过队列将类的实例传递给另一个线程时,我有点困惑。 假设这是Thread1的骨架: for(i=0; i<1000; i++) { Packet pkt = new Packet(); // instance of class pkt.id = i; thread2.queue.put(pkt); } 然后,线程2将从队列中删除数据包并执行冗长的操作。 这第二个线程是否获得了数据包的“副本”,还是通过某种forms的引用? 重要的是,如果它是通过复制,则可以在线程2完成数据包之前调用在线程1中创建的实例上的finalize()。 如果它是通过引用,我保证只对包中的信息调用finalize()一次。 这个基本示例可能没有显示重要性,但我在数据包中存储了一个C指针(来自JNI),以便在完成对象时销毁一些内存。 如果它是通过副本传递的,则内存可能会在第二个线程完成之前被销毁。 如果它是通过引用传递的,那么它应该只在GC看到BOTH线程不再使用它时才被销毁(我想要的行为)。 如果后一种情况得不到保证,我不会使用finalize()并使用其他东西,但会更复杂。

java从JFrame传递对象到JPanel

我正在使用NetBeans在Java中开发一个独立的应用程序,它通过串行端口获取和发送数据。 我正在使用一个很棒的串行通信API,称为java简单串行连接器http://code.google.com/p/java-simple-serial-connector/ 请下载我创建的以下NetBeans项目: http : //netload.in/dateiN9xmwRtn19.htm即使您没有netbeans,您仍然可以查看代码。 以上是我用来解释我希望完成的一个小例子项目。 该示例包含一个包含main方法的JFrame。 此JFrame包含2个面板:带导航按钮的面板和使用CardLayout显示面板1和面板2的面板。 在JFrame中,我有一个方法,使用jssc API的getPortNames()方法获取端口名称列表。 我的问题是,如何将这些端口名称字符串值从JFrame传递到我的Panel 1,而不使用以下内容,因为它不起作用:MyJFrame myjframe = new MyJFrame(); myjframe.getPortNames(); 气垫船满鳗鱼再次非常感谢你的解释,值得金。 我现在意识到我的问题是NetBeans而不是Java。 我对它不熟悉,但由于项目的规模和复杂性,我仍然更愿意使用它。 我在下面上传了2个截图,显示了我如何尝试将JFrame对象的“this”引用传递给NetBeans中的JPanel对象。 正如您在MyJFrame.java屏幕截图中看到的,NetBeans已将“this”引用标记为错误。 你能帮我解决这个问题吗? 此外,在您的解释的第一句中,您提到串行端口方法应该在单独的类中,而不是在JFrame中,因为它们是非GUI方法。 我完全同意你的意见,我更愿意这样做,因为它是正确的面向对象的方法。 但是这样做,我再次面临NetBeans中的同样问题。 我现在如何将对象引用从SerialPorts.java类传递给JFrame,JPanel等,以便我不会一直创建新的SerialPorts对象,记住我需要连接始终保持打开状态(例如没有使用SerialPorts sp = new SerialPorts();)。 非常感谢你的帮助。 在Panel 1的代码定制器中添加“this” MyJFrame.java – 编辑器将“this”引用为错误

传递参数与从函数返回参数

从标题中可以清楚地看出我们应该采用哪种方法? 意图是传递一些方法参数并获得输出。 我们可以传递另一个参数,方法会更新它,方法现在不需要返回任何东西,方法只会更新输出变量,它会反映给调用者。 我只想通过这个例子来构建问题。 List result = new ArrayList(); for (int i = 0; i < SOME_NUMBER_N; i++) { fun(SOME_COLLECTION.get(i), result); } // in some other class public void fun(String s, List result) { // populates result } 与 List result = new ArrayList(); for (int i = 0; i < SOME_NUMBER_N; i++) { List […]

在java中通过ref传递枚举

如何在java中通过引用传递enum参数? 有解决方案吗

“通过引用传递”究竟是什么意思?

谁有权决定? 编辑:显然我没有成功地完善我的问题。 我不是在问Java的论证是如何传递的。 我知道看起来像持有对象的变量实际上是一个包含对象引用的变量,并且该引用是按值传递的。 这里有很多很好的解释(在链接的线程和其他线程中)和其他地方。 问题是关于术语传递的技术含义 。 (结束编辑) 我不确定这是否是SO的正确问题,如果没有道歉,但我不知道更好的地方。 在这里的其他问题中已经说了很多,例如, Java是“传递参考”还是“传递价值”? 并通过引用或通过值传递? ,但我没有找到该术语含义的权威答案。 我认为“通过引用传递”意味着“将引用(通常是指针)传递给对象”,因此被调用者可以修改调用者看到的对象,而“按值传递”意味着复制对象,并让被调用者玩得开心(明显的问题:如果对象包含引用,深层复制或浅层)。 唱FW出现很多 地方 说 “通过参考传递”就是说, 这里有一些论点,它意味着更多,但定义仍然读取 一种ParameterPassing模式,其中将实际参数的引用(或者如果你想在政治上不正确,指针)传递给forms参数; 当被调用者需要forms参数时,它取消引用指针以获取它。 我没有找到很多地方给出更强的术语定义,在这个页面上,我发现“forms参数的左值被设置为实际参数的左值”。 并且,如果我理解正确, 这里使用相同的定义(“forms参数仅作为实际参数的别名。”) 事实上,我发现使用更强定义的唯一地方是反对这样一种观点,即在Java中,对象是通过引用传递的(这可能是由于我缺乏google-fu)。 所以,如果我把事情弄清楚,那就是通过参考传递 class Thing { … } void byReference(Thing object){ … } Thing something; byReference(something); 根据第一个定义大致对应(在C中) struct RawThing { … }; typedef RawThing *Thing; void byReference(Thing object){ // do something } […]

仅将ArrayList作为值传递而不是引用

简单地说,我有一个带有ArrayList参数的方法。 在方法中,我修改ArrayList的内容,仅用于与方法返回的内容相关的目的。 因此,我不希望作为参数传递的ArrayList完全受到影响(即不作为引用传递)。 我尝试的一切都未能达到预期的效果。 我需要做什么才能在方法中使用ArrayList的副本,但不能更改实际变量?

为什么修改了ArrayList参数,但没有修改String参数?

public class StackOverFlow { public static void main(String[] args) { ArrayList al = new ArrayList(); al.add(“A”); al.add(“B”); markAsNull(al); System.out.println(“ArrayList elements are “+al); String str = “Hello”; markStringAsNull(str); System.out.println(“str “+ str); } private static void markAsNull(ArrayList str){ str.add(“C”); str= null; } private static void markStringAsNull(String str){ str = str + “Append me”; str = null; } […]