final关键字的一些问题。

问题描述:

class Mydate{
}
public class FinalTest {
final int i;
final Mydate md;
FinalTest(){
i=4;
md=new Mydate();
}
public static void main(String args[]){
FinalTest ft=new FinalTest();
// ft.md=new Mydate(); --------这里我的引用并没有改变啊为什么出错?
我引用不还是Mydate的对象吗?引用改变到底是什么意思?
我在finaltest类中将md改为private mydate md;编译就能通过。private
不是默认的设置为final吗?
或者我将ft.md改为mydate.md编译也能通过。 = =
理解不到位请各位大神指点迷津!!谢过!!
}
}

首先,只有private方法都隐式指定为final,而变量没有这个说法,别混淆了。
final修饰基本类型时,final使数值不改变。
final修饰对象引用时,final使引用恒定不变,一旦被初始化指向一个对象,就无法再把引用指向另一个对象,就像你已经在构造函数中为引用指定一个对象了,所以再次修改时报错。
但是对象的属性可以修改,看代码

 class Mydate{
    private int i=1;

    public int getI() {
        return i;
    }

    public void setI(int i) {
        this.i = i;
    }

}
public class FinalTest {
    final int i;
    final Mydate md;
    FinalTest(){
        i=4;
        md=new Mydate();//引用已经被初始化指向一个对象
        }
    public static void main(String args[]){
        FinalTest ft=new FinalTest();
        System.out.println(ft.md.getI());//i=1
        ft.md.setI(2);
        System.out.println(ft.md.getI());//i=2
        //ft.md=new Mydate();//无法修改引用指向另一个对象。
        }
}

final 修饰的变量为常量。 是不能进行修改的

1,不是同一个对象,每次new都会产生新的对象。引用指向对象在内存中的地址。是不是同一个对象,你用equals方法就能看出来。
2,final不允许修改。

被final的修饰的是不能改变的,
总得来说对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

《Think in java》中140页有专门介绍final关键字的作用,final用在你这个地方,意思是md这个引用永远只能指向初始化的那个对象,就是地址不能变,
指向的对象可以改变,但是md这个地址是不变的,你第一次已经为他赋值了一个地址指向了一个对象,第二次你又想让他指向另一个对象,这样会改变
md的地址的,所以语法不通过

.final 修饰的变量为常量。 是不能进行修改的