A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 依然超级赛亚人 于 2014-8-13 08:09 编辑

大家好:
我是新来的成员,想跟大家请教两个问题:
1)在学java中final这个关键字时,我们知道“被它修饰的变量是常量,不能再重新赋值”。但对于上面这句话我的理解不够好,我想请问它修饰的变量在那个范围内不能再赋值呢?请大家详细赐教一下。
2)在学继承这一部分时,我在父类里定义了一个用final修饰的变量,我以为继承这个父类的子类里不能再对这个变量赋值,结果我给它赋值以后竟然没报错,还输出了新值,具体程序如下,请大家给分析一下问题出现在哪里?

class Father3
{
                int x=10;
                final double MY_PI=3.14;
                        
}

class Son3 extends Father3
{
                int x=20;
                        
            double MY_PI=6.28;//这里为什么不会编译报错?被覆写?

                void show(){
                        System.out.println(x);
                        System.out.println(MY_PI);
                }
               
                                
}

4 个回复

正序浏览
燿陚√揚葳 发表于 2014-7-10 21:10
没事的,成员变量和局部变量都可以被final修饰,public static final  double MY_PI=3.14会报错是因为,p ...

OK,明白了,十分受教!:handshake
回复 使用道具 举报
依然超级赛亚人 发表于 2014-7-10 18:55
经您这样一说我倒是豁然了,这让我想起讲继承时讲到的变量和方法的使用规则:父类和子类中有同名变量时, ...

没事的,成员变量和局部变量都可以被final修饰,public static final  double MY_PI=3.14会报错是因为,public和static修饰的是成员变量,不能修饰局部变量,就是你说的方法内的变量
回复 使用道具 举报
燿陚√揚葳 发表于 2014-7-10 18:26
不是覆盖......你可以把父类的变量继承过来,而子类中的变量是属于子类自己的变量,变量没有覆盖这种说法, ...

经您这样一说我倒是豁然了,这让我想起讲继承时讲到的变量和方法的使用规则:父类和子类中有同名变量时,子类方法中使用变量时先在局部找,局部没有就在本子类的成员范围找,加this关键字。如果子类中没有再去父类的成员范围找中找,并且在变量名前加关键字super。就是没想到常量也是这种用法,以为只要是final修饰的变量,在同一个文件中的所有地方都不可以再修改。多谢指点!
对了,就着这个final关键字还一个问题请教,是不是final只能在成员变量范围内修饰变量而不能在方法内部修饰变量呢,如下面这段代码:

class Father3
{
         void show(){
                int x=10;
                public static final  double MY_PI=3.14;//这里报错。
                System.out.println(x);
                System.out.println(MY_PI);
        }
               
}
回复 使用道具 举报
不是覆盖......你可以把父类的变量继承过来,而子类中的变量是属于子类自己的变量,变量没有覆盖这种说法,子类的成员变量与父类的成员变量同名而已
子类调用父类的变量,要加super如下代码:

  1. <P>class Father3 {
  2. int x = 10;
  3. final double MY_PI = 3.14;

  4. }</P>
  5. <P>class Son3 extends Father3 {
  6. int x = 20;</P>
  7. <P>double MY_PI = 6.28;//这是子类自己的变量与父类无关
  8. public void show() {
  9.   
  10.   System.out.println(x);
  11.   System.out.println(MY_PI);//这个是子类的MY_PI,前面有个省略的this
  12.   System.out.println(super.MY_PI);//这里输出的才是父类的MY_PI
  13. //  System.out.println(super.MY_PI++);//这里会报错因为加了super表示的是父类的MY_PI,因为是final修饰,不可以改变值,自增改变了他的值所以会报错
  14. }</P>
  15. <P>}</P>
复制代码
super也可以忽略不写比如子类中没有x,这个变量当你打印输出x时就是父类的变量了,不用再加super了

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马