黑马程序员技术交流社区

标题: 关于final修饰符的疑问 [打印本页]

作者: 苏伯亚    时间: 2014-4-13 09:50
标题: 关于final修饰符的疑问
我们都知道被final修饰的类不能被继承,方法不能被覆写,变量是一个常量只能赋值一次。但如果是下面这种情况怎么可以被多次赋值呢?
代码如下
class Outer
{
        int x = 3;

        void method(final int a)
        {
                final int y = a;
                //y=0;    //把这里的注释去掉就会报错,但是注释掉这句就运行没错
                class Inner
                {
                        void function()
                        {
                                System.out.println(y);
                        }
                }
        
                new Inner().function();
                System.out.println("y="+y);
                System.out.println("x="+x);
               
        }
}


class  InnerClassDemo3
{
        public static void main(String[] args)
        {
                Outer out = new Outer();
                out.method(7);
                out.method(8);
        }

}
运行结果如下
7
y=7
x=3
8
y=8
x=3

这里a和y都被赋值了两次,是为什么呢?
是不是每次方法的加载调用完后在内存中就清理掉,在调用再重新加载呢?如果是这样但这都是同一个对象out的方法啊,out类并没有运行完啊?这里有点不懂 求理解好的 给解释一下,谢谢

作者: Faner    时间: 2014-4-13 10:11
//y=0;  首先这句 为何不能要 因为你在 final int y = a; 已经赋值了 虽然他是个变量 只要在使用它之前给它赋值就行了
这里a和y都被赋值了两次,是为什么呢?
这个是因为你调用了二次方法 就像你说的方法调用完后就会释放 因为方法调用的时候会加载到栈内存运行 在调用就在加载

在一个类里面方法可以调用多次啊!
其实你这个是内部类的例子  为何 y 必须是final修饰 就是因为 内部类的访问局部变量必须是常量  有个生命周期的原因 你完全不用想太多 你就把他想成 一个方法叫method(final int a) 只是参数是个常量罢了!
作者: 苏伯亚    时间: 2014-4-13 10:20
Faner 发表于 2014-4-13 10:11
//y=0;  首先这句 为何不能要 因为你在 final int y = a; 已经赋值了 虽然他是个变量 只要在使用它之前给 ...

懂了 视频里有讲  又翻了翻看视频  弄明白了
作者: ilvsoft    时间: 2014-4-13 12:00
本帖最后由 ilvsoft 于 2014-4-13 12:02 编辑

1. //y=0;    //把这里的注释去掉就会报错,但是注释掉这句就运行没错。  因为y是final的,你已经吧a赋值给y了
2.这里a和y都被赋值了两次,是为什么呢?
例如一个小朋友类一次只能只一个糖切只能是同一种糖,现在你new了一个小女孩,给了他一个5毛钱的糖,那么这个时候他只能吃这个糖切不能换,但是你重新给他一个一块钱的糖,那么他现在又只能吃这个糖切不能换, 这里的糖相当于你上面类中的a,你好好想想
3,个人感觉你有点吧static和final混淆了,final虽然只能赋值一次,但它终究是个能赋值一次的变量,不想static再类加载的哪一个刻他已经不能被改变
作者: ilvsoft    时间: 2014-4-13 12:01
ilvsoft 发表于 2014-4-13 12:00
1. //y=0;    //把这里的注释去掉就会报错,但是注释掉这句就运行没错。  因为y是final的,你已经吧a赋值给 ...


1. //y=0;    //把这里的注释去掉就会报错,但是注释掉这句就运行没错。  因为y是final的,你已经吧a赋值给y了
2.这里a和y都被赋值了两次,是为什么呢?
例如一个小朋友类一次只能只一个糖切只能是同一种糖,现在你new了一个小女孩,给了他一个5毛钱的糖,那么这个时候他只能吃这个糖切不能换,但是你重新给他一个一块钱的糖,那么他现在又只能吃这个糖切不能换, 这里的糖相当于你上面类中的a,你好好想想
3,个人感觉你有点吧static和final混淆了,final虽然只能赋值一次,但它终究是个能赋值一次的变量,不想static再类加载的哪一个刻他已经不能被改变




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2