为什么可以修改标记为final的对象并在Java中调用非final方法?

时间:2016-02-15 04:23:31

标签: java android immutability final

我是Java的新手,我来自C ++背景。

我认为Java中的final就像C ++中的const一样,但我猜不是。

在C ++中以const身份启动的对象,只能调用const方法,不能更改对象中的字段。

但是在下面的代码中,我可以在pet中分配值。即pet.id = new ObjectId(newPetId);

private void addPet() {
    progressBar.setVisibility(View.VISIBLE);

    final Pet pet;

    try {
        // Locally add and save pet.
        pet = getPetFromUserInput();

    } catch (InvalidInputException e) {
        progressBar.setVisibility(View.GONE);
        return;
    }

    pet.id = new ObjectId(); // Modify field member directly.
    pet.updateName("MyPet"); // Call non-final method.
}

3 个答案:

答案 0 :(得分:3)

在评论中引用Erik的答案,我找到了对C ++程序员的简单解释。

Java中的

Pet pet;与C ++中的Pet* pet;类似。

Java中的

final Pet pet;与C ++中的Pet * const pet;类似,它使指针const而不是值本身。

请注意,Java和C ++之间存在细微差别。

在C ++中,你必须在声明一个const变量时分配一个值,但是在Java中,它允许你稍后但只能执行一次。

答案 1 :(得分:0)

在Java中,关键字“final”只是意味着一旦初始化,就无法更改变量的值。 例如,

final int x = 0;`
//You can't do this!!!
int x=5

它与该变量调用方法无关。

答案 2 :(得分:0)

在java中,“final”表示这个

1.如果你在课前使用“final”,那就意味着没有机会为该课程创建子类。

public final class Person {
void getName() {

}

}

然后你不能这样创造。

public class Man extends Person{
}
"The type Man cannot subclass the final class Person" will be shown
  1. 如果您在方法之前写下“final”,那么

    public  class Person {
    final void getName() {      
    }   
    }
    
  2. 然后你可以为这个Person类创建子类,但你不能覆盖子类中的getName()。

    public class Man extends Person{
    
    @Override
    void getName() {
        // TODO Auto-generated method stub
        super.getName();
    }
    
    }
    
    "Cannot override the final method from Person" will be shown.
    
    1. 如果在类中的变量之前写“final”,则无法更改该变量的值
    2. exammple:

      public  class Person {
      public final String name;
      void getName() {
      
      }   
      }
      

      然后在子类中,您无法修改该值。

      public class Man extends Person{
      
      public void getName() {
          name = "child";
      }
      
      }
      "The final field Person.name cannot be assigned" will be shown
      

      所有这些都将在编译时自行显示。

      希望这会对你有所帮助。