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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 帅哥哥 于 2014-4-20 22:34 编辑

今天看书看到一句话 “由于 static 修饰的方法默认都是 final 类型的,所以在 main() 方法前加上 final 修饰符也是可以的”,拜托各位给详细解释一下,感觉有点乱。。。3q!!!

3 个回复

倒序浏览
final定义的方法不能被覆盖,而static 修饰的方法也不能被覆盖。main方法也是被static修饰,一个程序里面也只有一个main方法,不会出现一个main覆盖另外一个main,所以用不用final修饰都一样,加上也无妨,只是多此一举。
在普及一下final与static的区别
final类 :final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。
final方法:如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。
final变量(常量) :用final修饰的成员变量表示常量,值一旦给定就无法改变!
final参数 :当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的值。
static:被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 土突突 于 2014-4-19 23:49 编辑

你这句话肯定前边还有什么前提条件,否则的话这句话是不完全正确的
首先由static修饰的方法不可能默认都是final类型的,因为被final修饰的方法不能被重写,但是被static修饰的方法是可以被重写的,有实例为证:

  1. class Test
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 new SonDemo().show();
  6.         }
  7. }

  8. class Demo
  9. {
  10.         public static void show()
  11.         {
  12.                 System.out.println("父类方法运行了");
  13.         }
  14. }

  15. class SonDemo extends Demo
  16. {
  17.         public static void show()//重写了父类方法
  18.         {
  19.                 System.out.println("子类方法运行了");
  20.         }
  21. }
复制代码

运行结果如下:见下图
C:\Documents and Settings\Administrator\桌面\QQ截图20140419233800.png
被static修饰的方法只是限制了方法只能调用类中的静态成员变量和静态函数
其好处是和静态成员变量一样,随着类的加载而加载,可以直接用类名调用而无需建立对象。
另外在 “main() 方法前加上 final 修饰符是可以的”是正确的。因为一个程序只可能有一个main方法。所以main方法无需也不能被重写。所以加上final修饰符是可以的。但是也是没必要的。

QQ截图20140419233800.png (2.91 KB, 下载次数: 9)

QQ截图20140419233800.png
回复 使用道具 举报
嗯,基本搞明白了,感觉好多东西都大有深度可言啊,越来越感觉自己太嫩了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马