黑马程序员技术交流社区
标题: 求帮助 [打印本页]
作者: 周一川 时间: 2013-4-15 23:38
标题: 求帮助
abstract 的method 是否可同时是static,是否可同时是native,是否可同
时是synchronized?
作者: 艾萱 时间: 2013-4-15 23:47
都不可以,因为abstract申明的方法是要求子类去实现的,abstract只是告诉你有这样一个接口,你要去实现,至于你的具体实现可以是native和synchronized,也可以不是,抽象方法是不关心这些事的,所以写这两个是没有意义的。
然后,static方法是不会被覆盖的,而abstract方法正是要子类去覆盖它,所以也是没有意义的。
所以,总的来说,就是java语法不允许你这样做,事实上,也没有意义这样做。
作者: 刘永建 时间: 2013-4-15 23:49
abstract的method 不可以是static的,因为抽象的方法是要被子类实现的 native方法表示该方法要用另外一种依赖平台的编程语言实现的,不存在着被子类实现的问题,所以,它也不能是抽象的,不能与abstract混用;
关于synchronized与abstract合用的问题,从来没见到过这种情况,并且我觉得synchronized应该是作用在一个具体的方法上才有意义。而且,方法上的synchronized同步所使用的同步锁对象是this,而抽象方法上无法确定this是什么
作者: Sword 时间: 2013-4-16 01:23
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连用
作者: 段旭东 时间: 2013-4-16 02:18
static、native、synchronized修饰的方法在子类中都是不可见的,而一个类的abstract方法是要被其子类实现的,要继承以实现方法,这个方法首先要是可见的,所以abstract不可以和static、native、synchronized一起。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |