【问题标题】:Regarding final keyword in the method setName() of Thread class [duplicate]关于Thread类的方法setName()中的final关键字[重复]
【发布时间】:2016-12-20 17:39:07
【问题描述】:

final是java中的访问修饰符还是非访问修饰符?

Thread 类 public final void setName(string name) 的 setName() 方法真的是 final 吗?如果是,是否意味着一旦更改了线程名称,以后就无法更改,因为 final 关键字..?

或者 final 不是 setName() 方法的一部分?

请指导我正确答案..

【问题讨论】:

  • 另一个值得一读的好问题:stackoverflow.com/questions/1351568/…
  • @ErwinBolwidt 非常感谢
  • public final void setName(String name) 的哪一部分你不明白? final 的哪一部分你不明白?
  • @EJP 我得到了答案。如果它已标记为最终,则不能被覆盖。并且线程类的预定义方法不能是最终的,如果是,我们不能使用它..!

标签: java multithreading


【解决方案1】:

请理解有以下区别:

  1. member variables 设为最终并

    • 当任何类的variables被标记为final时,这意味着它们以后不能更改
    • 要记住的一点:正如@GhostCat 所指出的,当将member variables 标记为final 时,一旦分配了final 变量,它总是包含相同的值,但是,它所引用的对象可能会改变。例如考虑这个List 对象:

      final List<Integer> list = new ArrayList<Integer>();  
      list = new ArrayList<Integer>(); // Invalid  
      list.add(2); //Valid  
      

      更多详情请参阅this 回答。

  2. method declarations 标记为最终状态

    • 只要任何method 被声明为final,就意味着它不能被子类覆盖。
  3. 将java中的classes作为final
    • 当任何类被声明为 final 时,这意味着它不能被子类化,即它不能被任何其他类扩展。 (例如,String 类)

现在既然Thread 类的setName() 方法是final,并不意味着我们不能改变这个Threadname。相反,它只是意味着这个方法不能被extends这个类的类覆盖。

【讨论】:

  • 您也可以添加有关使课程最终确定的信息。也许要指出,是的,最终变量指向的引用也无法更改;但是变量本身仍然可以“更改”(例如:当该变量是列表时添加/删除元素)。
  • @Raman Sahasi 非常感谢!
  • 我已经添加了该信息@GhostCat 感谢您指出。
  • 您的“要记住的要点”是从前到后的。变量不能改变,但它引用的对象可能会发生变异。 @GhostCat 的语言选择不当。
  • @EJP 对不起,这是一个快速复制粘贴。无论如何,感谢您指出这一点。我已经相应地更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
  • 2018-06-17
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
  • 2011-06-09
相关资源
最近更新 更多