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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周一川 中级黑马   /  2013-4-15 23:38  /  1046 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

abstract method 是否可同时是static,是否可同时是native,是否可同
时是synchronized?

4 个回复

倒序浏览
都不可以,因为abstract申明的方法是要求子类去实现的,abstract只是告诉你有这样一个接口,你要去实现,至于你的具体实现可以是native和synchronized,也可以不是,抽象方法是不关心这些事的,所以写这两个是没有意义的。
然后,static方法是不会被覆盖的,而abstract方法正是要子类去覆盖它,所以也是没有意义的。
所以,总的来说,就是java语法不允许你这样做,事实上,也没有意义这样做。
回复 使用道具 举报
abstract的method 不可以是static的,因为抽象的方法是要被子类实现的        native方法表示该方法要用另外一种依赖平台的编程语言实现的,不存在着被子类实现的问题,所以,它也不能是抽象的,不能与abstract混用;
关于synchronized与abstract合用的问题,从来没见到过这种情况,并且我觉得synchronized应该是作用在一个具体的方法上才有意义。而且,方法上的synchronized同步所使用的同步锁对象是this,而抽象方法上无法确定this是什么
回复 使用道具 举报
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是什么。
1、abstract与static
     (what)
     abstract:用来声明抽象方法,抽象方法没有方法体,不能被直接调用,必须在子类overriding后才能使用
     static:用来声明静态方法,静态方法可以被类及其对象调用
     (how)
     static与abstract不能同时使用
     (why)
      用static声明方法表明这个方法在不生成类的实例时可直接被类调用,而abstract方法不能被调用,两者矛盾。
2、abstract与native
     (what)
     native:用来声明本地方法,该方法的实现由非java 语言实现,比如C。一般用于java与外环境交互,或与操作系统交互
     (how)
      native 可以与所有其它的java 标识符连用,但是abstract除外。     
      (why)
      因为native 暗示这些方法是有实现体的,只不过这些实现体
      是非java 的,但是abstract却显然的指明这些方法无实现体。
3、abstract与synchronized
      (what)
      synchronized:用于防止多个线程同时调用一个对象的该方法,与static连用可防止多个线程同时调用一个类的该方法
      (how)
      abstract与synchronized不能同时使用
      (why)
       从synchronized的功能也可以看出,用synchronized的前提是该方法可以被直接调用,显然和abstract连用
回复 使用道具 举报
static、native、synchronized修饰的方法在子类中都是不可见的,而一个类的abstract方法是要被其子类实现的,要继承以实现方法,这个方法首先要是可见的,所以abstract不可以和static、native、synchronized一起。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马