为什么整数类对象的引用增量操纵整数值?

时间:2015-09-28 05:12:22

标签: java object reference integer

我有一个基本的疑问,我们可以增加Integer类对象的引用,而不是任何其他类的引用(D类有1个Integer数据成员和一个参数化构造函数)。

     let saveAction = UIAlertAction(title: "Search",
        style: UIAlertActionStyle.Default,
        handler: {(action) in
            let query =
            (alertController.textFields?[0] as UITextField).text ### errors here
            let tag = query
            if !query.isEmpty {
                if self.model.queryForTag(tag) != nil {
                }
                else if isNew {
                    self.model.saveQuery(
                        query, forTag: tag, syncToCloud: true)
                    let indexPath =
                    NSIndexPath(forRow: 0, inSection: 0)
                    self.tableView.insertRowsAtIndexPaths([indexPath],
                        withRowAnimation: .Automatic)
                    self.forceSearch(indexPath)
                    self.tableView.reloadData()
                }
            }
    })

这里x和d都是引用仍然我们能够增加整数引用而不是任何其他引用。我遗漏了一些非常基本的东西,请帮帮我。

4 个答案:

答案 0 :(得分:2)

Integer x=new Integer(10); x++;

这里java编译器将执行对象的un-boxing,它将Integer对象转换为原始int。然后执行增量操作。这仅适用于java原语,auto-boxing是将原语转换为包装器对象,反之则是调用un-boxing。这就是这里发生的事情。

auto-boxingun-boxing是自动转换,仅为java基元定义。所以它不能在其他对象上执行。请记住,对象不仅仅是C or C++等内存引用,我们可以递增它们。

答案 1 :(得分:1)

这是因为从jdk 1.5引入的包装类的Autoboxing。内部java会将整数引用转换为int并递增它。你不能增加对象。

答案 2 :(得分:1)

Java无法为任意类重载运算符。因此,public class D { private int value; public D( int v ){ value = v; } public void increment(){ value++; } } 无法使用。你可以这样做:

D d = new D(10);
d.increment();

现在你可以做到

RestAdapter retrofit= new RestAdapter.Builder().setEndpoint("end_point_url")
                .build();
AbebeerApi service = retrofit.create(AbebeerApi.class);
service.getBeer(new Callback<BeerResponse>() {

            @Override
            public void success(BeerResponse beerResponse, Response res) {
                // Use beerResponse for response
            }

            @Override
            public void failure(RetrofitError error) {
            }
        });

和d's的值将是11。

答案 3 :(得分:1)

根据Oracle Java Documentation,原始数据类型自动转换为等效的包装类型称为autoboxing,相反的操作称为unboxing。每当我们在表达式中使用包装类的对象时,JVM就会自动进行拆箱和自动装箱。

Integer object;
object = 100;        //Autoboxing of int
++object;

当我们对Integer对象执行增量操作时,首先将其取消装箱,然后递增,然后再次重新装箱为Integer类型对象。您还可以查看How java auto boxing/unboxing works?