java可以修改final 对象吗
基本数据类型是不可以被修改了,包括String.但是也有例外.如Map,List等,即使你用final修饰了,依然可以put和add说到底,还是引用问题.final意味着引用不可变罢了
java final对象在这种情况下什么时候会被销毁?
不会,Java使用的是GC(垃圾回收)机制,只有对象还有有效引用就不会被回收,举个栗子:
void Method()
{
final FooManager manager = new FooManager();
new AsyncTask(new AsyncTaskHandler()
{
@Override
public Object execute()
{
// A long long running…
return null;
}
@Override
public void onPostExecute()
{
manager.doXxx(); // 这里回调调用方法。
}
}).execute();
}
这个情况下,manager的对象被AsyncTaskHandler“捕捉”了,直到onPostExecute运行完之前,AsyncTaskHandler都会持有manager的有效引用,不会被GC清理掉。
java 中的 final 关键字有哪些用法
(1)修饰变量
用final关键字修饰的变量,只能进行一次赋值操作,并且在生存期内不可以改变它的值。final 修饰的变量可以先声明,后赋值。
final修饰基本类型时,起到常量的作用,基本类型的值不可变。
final修饰引用类型时,不能再指向其他的对象,但被引用的对象的值是可以改变的(引用变量的值
实际上是它所引用的对象的地址)。
当用final作用于类的成员变量时,成员变量(局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行初始化赋值。
(2)修饰方法参数
编写方法时,可以在参数前面添加final关键字,它表示在整个方法中,不会(实际上是不能)改变参数的值,具体类似于修饰数据。
即不能改变参数的值,但是可以改变引用类型参数的对象的值。同时,即使没有final的修饰,参数的改变也不会影响到方法外的变量。
(3)修饰方法
final关键字修饰方法,它表示该方法不能被覆盖(重写)。另外,类中所有的private方法都隐式地指定为是final的,由于无法在类外使用private方法,所以也就无法覆盖它。此时可以在子类中定义相同的方法名和参数,这种情况不再产生重写与final的矛盾,而是在子类中重新定义了新的方法。可以对private方法添加final修饰符,但并没有添加任何额外意义。
(4) 修饰类
用final修饰的类是无法被继承的。且final类中的所有成员方法都会被隐式地指定为final方法。
JAVA–final修饰符 final一个对象(一段程序)
final就是一个修饰符,只是要被final注明了的对象或变量都是“最终的”,不可再次改变的。
如楼上所说final Box boxobj = new Box(25);只是说明了Box所生成的实例是最终的,但这个实例的成员变量如果没有被final注明了就还是可以改变的,所以boxobj.height = 32;是可以的。
多想几遍,理清关系就能够理解了。
Java中final 一般是什么作用,什么情况用
1. 修饰基础数据成员的final
这是final的主要用途,其含义相当于C/C++的const,即该成员被修饰为常量,意味着不可修改。如java.lang.Math类中的PI和E是final成员,其值为3.141592653589793
和2.718281828459045。
2. 修饰类或对象的引用的final
在Java中,我们无法让对象被修饰为final,而只能修饰对象的引用,这意味着即使你写public final A a = new A(); 事实上a指向的对象的数据依然可以被修改,不能修改的是a本身的引用值,即你不能再对a进行重赋值。同样的情况出现在数组中,比如public final int[] a = {1, 2, 3, 4, 5},事实上a中的数值是可修改的,即可以写a[0] = 3。据目前了解,java中数组内的数据是无法修饰为不可修改的,而C/C++可以。
3. 修饰方法的final
修饰方法的final和C/C++中修饰成员对象的const大不相同。首先,修饰方法的final含义不是“不可修改”,而是指该方法不可被继承成员重新定义。(注意,这里所说的不能被重新定义,并不是指子类一定不能定义同名方法,如果父类的方法是私有类型,子类是允许定义该方法的,这里指的不能重新定义是指不能通过改写方法来使得方法重写的多态性得以实现,如不希望A a = new B(); a.f();这样的重写方法情况出现)
示例:
public class A {
// final方法f
public final void f() {
System.out.println(“类A中的final方法f被调用了”);
}
}
public class B extends A {
// 编译错误!父类的f方法是final类型,不可重写!
//! public void f() {
//! System.out.println(“类B中的方法f被调用了”);
//! }
}