@Stateless
public class CustomerManager {
   @PersistenceContext("Chapter03-Unit")
   private EntityManager em;
   
   public void createCustomer() {
       final Customer cust = new Customer();
       cust.setName("Moneybags MgGee");
       em.persist(cust);
   }}cust是FINAL类型号的, 为什么也可以改变它的NAME属性呢?

解决方案 »

  1.   

    我的理解是这样的,final Customer cust = new Customer(); 这句话的意思是说引用变量cust是final的,但是引用变量cust指向的内容并不是final的,所以可以设置属性
      

  2.   

    Name 是一个STRING对象, cust.setName("Moneybags MgGee"); 会改变变量cust的引用,
    FINAL 倒底是可以改变什么东西? 可以改变对象的引用?
      

  3.   

     
      你这里修改的是cust实例的值,不是cust对象  final修饰的对象值不能被改变,我认为这里的final修饰
      的cust对象是相对于它所引用的对象不能改变.  例如:
             final String str = "test";         String str1 = "hello word";
             
             这里就不能如下设置:
             
                    str = str1;
           
           
           
      

  4.   

    final 修饰的基本类型的数据是不可变 但是非基本类型 只能保证它引用的对象不能再变了 但是它引用的对象本身却是可变的 也就是说你的cust引用了一个Customer实例就不能再引用其他的Customer实例了 基本上等于你的cust不能再被赋值而已 但是Customer对象本身是可变的
      

  5.   

    是不是说final修饰了cust对象, 只能确定cust的引用不变,
    而cust中的属性Name是可以变的, 不受final的影响?
      

  6.   


     你自己看看final的定义就知道了 final用于修饰类,方法和变量.final所修饰的变量不能被改变!!!!! 仔细读读!!!!
      

  7.   

    这句话对不对啊:是不是说final修饰了cust对象, 只能确定cust的引用不变,
    而cust中的属性Name是可以变的, 不受final的影响?
      

  8.   

    对象是final,属性是可以改变的,
    面试题一般都有这个的
      

  9.   


    final Customer cust = new Customer(); 
    cust.setName("Moneybags MgGee"); //right
    Customer anotherCust=new Customer();
    cust=anotherCust;//wrong