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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 李易烜 于 2013-4-14 09:09 编辑

我来个问题:abstract的method是否可同时是static,是否可同时是native,是否可同时是是synchronized?

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

4 个回复

倒序浏览
因为static修饰的方法可以通过类名直接调用,而abstract修饰的方法不行。
回复 使用道具 举报
abstract的method 不可以是static的,因为抽象的方法是要被子类实现的,而static与子类扯不上关系!
native方法表示该方法要用另外一种依赖平台的编程语言实现的,不存在着被子类实现的问题,所以,它也不能是抽象的,不能与abstract混用。例如,FileOutputSteam类要硬件打交道,底层的实现用的是操作系统相关的api实现,例如,在windows用c语言实现的,所以,查看jdk 的源代码,可以发现FileOutputStream的open方法的定义如下:
private native void open(String name) throws FileNotFoundException;
如果我们要用java调用别人写的c语言函数,我们是无法直接调用的,我们需要按照java的要求写一个c语言的函数,又我们的这个c语言函数去调用别人的c语言函数。由于我们的c语言函数是按java的要求来写的,我们这个c语言函数就可以与java对接上,java那边的对接方式就是定义出与我们这个c函数相对应的方法,java中对应的方法不需要写具体的代码,但需要在前面声明native。
关于synchronized与abstract合用的问题,我觉得也不行,我觉得synchronized应该是作用在一个具体的方法上才有意义。而且,方法上的synchronized同步所使用的同步锁对象是this,而抽象方法上无法确定this是什么。

点评

good  发表于 2013-4-14 00:16

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
abstract方法是子类应覆盖的方法,所以在抽象类中声明它时,不能使用private关键字,(private意味着抽象类的外部类无法访问,既然无法访问,覆盖也就无从谈起)
static方法在不创建对象时也可以调用,所以方法体(body)也应该被定义,若无方法体,也就是不能以”类名。方法名()”的形式对其调用,所以abstract方法(无方法体)不能被static关键字修饰

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
  1. 1、abstract与static
  2.      abstract:用来声明抽象方法,抽象方法没有方法体,不能被直接调用,必须在子类overriding后才能使用
  3.      static:用来声明静态方法,静态方法可以被类及其对象调用
  4.      static与abstract不能同时使用
  5.           用static声明方法表明这个方法在不生成类的实例时可直接被类调用,而abstract方法不能被调用,两者矛盾。
  6. 2、abstract与native
  7.     native:用来声明本地方法,该方法的实现由非java语言实现,比如C。一般用于java与外环境交互,或与操作系统交互
  8.     native可以与所有其它的java标识符连用,但是abstract除外。
  9.     因为native暗示这些方法是有实现体的,只不过这些实现体是非java的,但是abstract却显然的指明这些方法无实现体,自相矛盾。
  10. 3、abstract与synchronized
  11.     synchronized:用于防止多个线程同时调用一个对象的该方法,与static连用可防止多个线程同时调用一个类的该方法
  12.     abstract与synchronized不能同时使用
  13.     从synchronized的功能也可以看出,用synchronized的前提是该方法可以被直接调用,显然和abstract连用是不行的。
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马