abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
Posted minisimple
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?相关的知识,希望对你有一定的参考价值。
abstract的method不可以是static的,因为抽象的方法是要被子类实现的,而static与子类扯不上关系!
native方法表示该方法要用另外一种依赖平台的编程语言实现的,不存在着被子类实现的问题,所以,它也不能是抽象的,不能与abstract混用。例如,FileOutputSteam类要硬件打交道,底层的实现用的是操作系统相关的api实现,例如,在windows用c语言实现的,所以,查看jdk的源代码,可以发现FileOutputStream的open方法的定义如下:
private native void open(Stringname) throws FileNotFoundException;
如果我们要用java调用别人写的c语言函数,我们是无法直接调用的,我们需要按照java的要求写一个c语言的函数,又我们的这个c语言函数去调用别人的c语言函数。由于我们的c语言函数是按java的要求来写的,我们这个c语言函数就可以与java对接上,java那边的对接方式就是定义出与我们这个c函数相对应的方法,java中对应的方法不需要写具体的代码,但需要在前面声明native。
关于synchronized与abstract合用的问题,我觉得也不行,因为在我几年的学习和开发中,从来没见到过这种情况,并且我觉得synchronized应该是作用在一个具体的方法上才有意义。而且,方法上的synchronized同步所使用的同步锁对象是this,而抽象方法上无法确定this是什么。
面试题以及解析:
1,abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
都不可以,因为abstract申明的方法是要求子类去实现的,abstract只是告诉你有这样一个接口,你要去实现,至于你的具体实现可以是native和synchronized,也可以不是,抽象方法是不关心这些事的,所以写这两个是没有意义的。然后,static方法是不会被覆盖的,而abstract方法正是要子类去覆盖它,所以也是没有意义的。所以,总的来说,就是java语法不允许你这样做,事实上,也没有意义这样做。
abstract需要重载,static为类方法,没有重载一说 abstract为没有实现的方法,native为本机实现的方法,自相矛盾 abstract方法没有实现,也不可能实际调用抽象方法,没有必要synchronized修饰,当然子类可以根据需要同步该方法.所以 都不能.
2,接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继
承实体类(concrete class)?
接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实
体类,但前提是实体类必须有明确的构造函数。
3,启动一个线程是用run()还是start()?
启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态
,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法
可以产生必须退出的标志来停止一个线程。
4,构造器Constructor是否可被override?
构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Ove
rloading。
以上是关于abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?的主要内容,如果未能解决你的问题,请参考以下文章
Java面试题10 abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
abstract的方法是否可同时是static,是否可同时是native,是否可同时是synchronized?