final修饰基本类型和引用类型变量的区别



当使用final修饰基本类型变量时,不能对基本类型变量重新赋值,因此基本类型变量不能被改变。但对于引用类型的变量而言,它保存的仅仅是一个引用,final只保证这个引用所引用的地址不会改变,即一直引用同一个对象,但这个对象完全可以发生改变。


final int[] iArr={6,8,9,10}

//对数组进行排序,合法

Arrays.sort(iArr);

System.out.println(Arrays.toString(iArr));

//对数组元素赋值,合法

iArr[2]=-8;

//下面语句对iArr重新赋值,非法

iArr=null;


注意两种写法:

public class Person

{   private final Name name;

     public Person(Name name)

     {

      this.name=new Name(name.getFirstName(),name.getLastName());

     }

    

    public Name getName()

   {

     return new Name(name.getFirstName(),name.getLastName())

   ]

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

public class Person

{   private final Name name;

     public Person(Name name)

     {

      this.name=name;

     }

    

    public Name getName()

   {

     return name;

   ]

}

第二种写法:当name内容发生改变时,person也会改变,因为他们公用一个name。


因此如果需要设计一个不可变类,必须注意引用类型的属性,如果引用类型是可变的,必须采用必要的措施保护该属性引用对象不会被修改,这样才能创建真正不可变类。


对于一个private方法,因为它仅在当前类中可见,所以其子类无法访问该方法,就无法重写该方法========如果子类中定义一个与父类private方法有相同方法名,相同形参列表,相同返回值类型的方法,也不是方法重写,只是重新定义了一个新方法。因此

即使用final修饰一个private访问权限的方法,依然可以在其子类中定义与该方法具有相同方法名,相同形参列表,相同返回值类型的方法。



final类

final修饰的类不可有子类,例如java.lang。Math类就是一个final类,它不可以有子类。

猜你喜欢

转载自blog.csdn.net/durenniu/article/details/79587509