我可以在 java 中通过引用传递值吗

Can i pass value by reference in java

提问人:kshamajain99 提问时间:7/2/2014 更新时间:7/2/2014 访问量:128

问:

代码片段

 public void parsequery()
 {

        ParseQuery<ParseObject> query = ParseQuery.getQuery("Products");
        query.whereEqualTo("StoreID", StoreID);
        query.findInBackground(new FindCallback<ParseObject>() {
        public void done(List<ParseObject> objects, ParseException e) {
                if (e == null) {

                    for(int j=0; j<array.size();j++){


                            ParseQuery<ParseObject> query1 = ParseQuery.getQuery("Products");
                            c = array.get(j);
                            Log.d("C",""+c);
                            query1.whereEqualTo("SubCategory", c);
                            query1.findInBackground(new FindCallback<ParseObject>() {
                                public void done(List<ParseObject> objects1, ParseException e) {
                                    if (e == null) {

                                        productList.clear();
                                        Log.d("Inner LOOP",""+objects1.size());
                                        for(int i=0; i<objects1.size();i++)
                                        {

                                            SingleRow temp1 = new SingleRow(objects1.get(i).getString("Name"),objects1.get(i).getString("Description"),objects1.get(i).getInt("Price"),objects1.get(i).getString("Store"),objects1.get(i).getObjectId(),1);
                                            productList.add(temp1);
                                        }
                                        productList  temp11 = new productList(productList);

                                        productList1.add(temp11);

                                    }else{
                                        Log.d("score", "Error: " + e.getMessage());
                                    }

                                }

                                }); 
                    }

                        Handler handler = new Handler();
                        handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {

                                for(int k =0; k<array.size();k++){

                                Log.d("ProductList22",""+productList1.get(k).getProductList());
                                ArrayList<SingleRow>  temp2 =  productList1.get(k).getProductList();
                                SubcategorySinglerow temp = new SubcategorySinglerow(array.get(k),temp2);
                                categoryList.add(temp);
                                bool=true;  
                                }
                                myList.addHeaderView(header, null, false);
                                Log.d("categoryListAdapter", ""+categoryList);
                                listAdapter = new MyListAdapter(getActivity(), categoryList);
                                myList.setAdapter(listAdapter);
                                layout.setVisibility(View.GONE);
                                myList.setVisibility(View.VISIBLE);
                            }
                        }, 5000);

                } else {
                    Log.d("score", "Error: " + e.getMessage());
                }
    }
        });
 }

在这里我传递值 productList1.get(k).getProductList();通过 productList 到 subcategorysinglerow 类,我在每次执行 for 循环后都会清除它,因为我需要向它添加新值。因此,它最终为类 productList 中的每个 productList1 传递 productList 的值,因为 java 是按值传递的。有没有办法在java中通过引用传递值。我该如何解决我的问题。

java android arraylist parse-platform pass-by-value

评论

6赞 TheLostMind 7/2/2014
在 java 中,一切都是 .甚至参考资料Pass-By-Value
0赞 Scary Wombat 7/2/2014
如果将对象传递到方法中,则可以在方法中修改它
0赞 kshamajain99 7/2/2014
@TheLostMind我知道 java 是按值传递的。那么有没有其他方法可以让我设置我的数据。
0赞 newacct 7/3/2014
@ScaryWombat:你不能“传递对象”,因为“对象”在 Java 中不是值。Java 中没有“对象类型”——只有基元类型和引用类型。
0赞 Scary Wombat 7/3/2014
@newacct让我们将其改写为任何扩展 Object 的东西,它不是不可变的

答:

-1赞 Gabe Sechan 7/2/2014 #1

Java 不是按值传递的,不是真的。Java 中类的所有变量都是引用。将它们视为 C++ 指针(它们通常是指针,但现在这是不必要的细节)。因此,您正在按值传递指针,这与传递按引用指向的值相同。如果更改引用中的值,则该值将全局更改。唯一的例外是基本数据类型 - int、boolean、double 等,因为它们不是引用。

现在有一些类是不可变的 - 没有函数可以更改其内部值。对于这些,您可以通过传递一个数据结构来轻松绕过它,该数据结构将您想要的实际数据作为实例变量。

评论

0赞 kshamajain99 7/2/2014
我通过清除变量在每个 for 循环后设置变量中的值。有没有其他方法可以传递值,以便我为每个 productlist1 传递特定值。
0赞 Gabe Sechan 7/2/2014
你在 Java 中看到的所有变量,比如 MycLass foo;它们都是引用。不是对象。
0赞 Scary Wombat 7/2/2014
对对象的引用
1赞 newacct 7/3/2014
“Java 不是按价值传递的,不是真的。”Java 完全是按值传递的。
0赞 Alexander 7/2/2014 #2

也许,你可以使你的变量成为类的成员。

或者你可以做

class MyValue {
 public int val;
}

MyValue v = new MyValue();
v.val = 1;

// In other class
void modify(MyValue v) {
   v.val = 2;
}