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

© 王春蕾 中级黑马   /  2014-4-13 22:09  /  1452 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

学习final关键字的很疑惑,有几个问题搞不懂
1、final修饰的类为什么不能被继承?不能被继承的类有什么用处?
2、帮我看下下面的代码有什么问题,为什么编译时会提示是非法的表达式开始呢?
  1. class FinalDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 static final int X=10;
  6.                 System.out.println(X);
  7.         }
  8. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

8 个回复

正序浏览
本帖最后由 Emperors 于 2014-4-14 23:23 编辑

描述:
final是java中的一个关键字,可以用来修饰变量、方法和类。用关键词final修饰的域成为最终域。用关键词final修饰的变量一旦赋值,就不能改变,也称为修饰的标识为常量。如果一个类的域被关键字final所修饰,它的取值在程序的整个执行过程中将不会改变。
假如说整个类都是final,就表明自己不希望从这个类继承,或者不答应其他任何人采取这种操作。换言之,出于这样或那样的原因,我们的类肯定不需要进行任何改变;或者出于安全方面的理由,我们不希望进行子类化(子类处理)。
除此以外,我们或许还考虑到执行效率的问题,并想确保涉及这个类各对象的所有行动都要尽可能地有效。
2举例
编辑

class SmallBrain {}
final class Dinosaur
{
int i = 3;
int j = 4;
SmallBrain x = new SmallBrain();
void f() {}
}
public class Jurassic
{
public static void main(String[] args)
{
Dinosaur n = new Dinosaur();
n.f();
n.i = 40;
n.j++;
}
}
注意数据成员既可以是final,也可以不是,取决于我们具体选择。应用于final的规则同样适用于数据成员,无论类是否被定义成final。将类定义成final后,结果只是禁止被继承——没有更多的限制。然而,由于它禁止被继承,所以一个final类中的所有方法都默认为final。因为此时再也无法覆盖它们。所以这与我们将一个方法明确声明为final一样。
可为final类内的一个方法添加final指示符,但这样做没有任何意义。

评分

参与人数 1技术分 +1 收起 理由
黑妞~ + 1

查看全部评分

回复 使用道具 举报
kuroro自走核炮 发表于 2014-4-13 22:39
唔……final不就是为了让类不被继承而使用的关键字么?并不是所有的类都需要被继承的,java的特性里面有一 ...

final的封装性相当的牛啊,封起来谁都不准动;P
回复 使用道具 举报
skyfly 中级黑马 2014-4-13 23:56:37
7#
只有类才存在静态的变量 方法只能对静态变量的操作,不能在方法内试图定义静态变量否则的话会抛出编译错误.
静态变量的本意是为了让所有的对象共享这个变量,如果在方法里面定义静态变量的话就存在逻辑错误了,也达不到你想要目的. 因为在方法定义静态变量根本没有他的任何意义. 任何对象都有自己的方法,即使是静态方法,方法内的变量也是在方法调用时候才开始分配内存,所以想给成静态的在逻辑上存在问题 。

所以你是不能在这个主函数中定义一个静态变量的,

final可以修饰类,方法,变量。
final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。
在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为final类。
这也是提高了(方法,变量)功能安全性,因为不能被继承覆盖它。

评分

参与人数 1技术分 +1 收起 理由
黑妞~ + 1

查看全部评分

回复 使用道具 举报
  1. /*
  2. java语言规定
  3. ① final可以修饰类,方法,变量。
  4. ② final修饰类不可以被继承,但是可以继承其他类。  
  5. ③ final修饰的方法不可以被覆写,但可以覆写父类方法。
  6. ④ final修饰的变量称为常量,这些变量只能赋值一次。
  7. ⑤ 内部类在局部时,只可以访问被final修饰的局部变量。
  8. ⑥ final修饰的引用类型变量,表示该变量的引用不能变,而不是该变量的值不能变;

  9. */
  10. class FinalDemo
  11. {

  12.         public static void main(String[] args)
  13.         {

  14.                 static final int X=10;//主函数是静态的,主函数内的字段就是静态的无需再加static修饰。

  15.                 System.out.println(X);

  16.         }

  17. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黑妞~ + 1

查看全部评分

回复 使用道具 举报
fina不被继承,是为了避免子类复写功能。
去掉static就可以了。

回复 使用道具 举报
本帖最后由 kuroro自走核炮 于 2014-4-13 22:40 编辑

唔……final不就是为了让类不被继承而使用的关键字么?并不是所有的类都需要被继承的,java的特性里面有一条:封装,我记得final也是一种封装的表现。至于运行的问题,我觉得是在那个定义x的static上吧?
回复 使用道具 举报
class FinalDemo
{
        public static void main(String[] args)
        {
                static final int X=10;//改为final int X=10;就好了
                System.out.println(X);
        }
}
回复 使用道具 举报
1.final关键字译为终极的,不可改变的,被final修饰的变量相当于常量,不能被改变,被final修饰的类不能被继承,          这是java语言规定的。不能被继承的类就不能衍生子类,就像String类一样,我觉得好处可能就是为了给封装起来,不想被使用和覆写类中的方法,为了安全性考虑吧
2.楼主的问题在于主函数是静态的,在静态方法里定义的变量就是静态的了,不需加static,静态方法里的变量是临时变量,只在静态方法里有效。而声明static表示该变量属于类。所以不能声明为static。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

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