Java面试过程中会遇到的问题

转自:http://hxraid.javaeye.com/blog/749507

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

abstract的method 不可以是static的 ,因为抽象的方法是要被子类实现的,而static与子类扯不上关系!
abstract的method 不可以是native的, 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。
abstract的method 不可以是synchronized的, 在我几年的学习和开发中,从来没见到过这种情况,并且我觉得synchronized应该是作用在一个具体的方法上才有意义。而且,方法上的synchronized同步所使用的同步锁对象是this,而抽象方法上无法确定this是什么。

2、super.getClass()方法调用
下面程序的输出结果是多少?

Java代码
import java.util.Date;
public  class Test extends Date{
    public static void main(String[] args) {
        new Test().test();
    }

    public void test(){
        System.out.println(super.getClass().getName());
    }
}

在test方法中,直接调用getClass().getName()方法,返回的是Test类名
由于getClass()在Object类中定义成了final,子类不能覆盖该方法, 所以,在
test方法中调用getClass().getName()方法,其实就是在调用从父类继承的getClass()方法,等效于调用 super.getClass().getName()方法,所以,super.getClass().getName()方法返回的也应该是Test。
如果想得到父类的名称,应该用如下代码:getClass().getSuperClass().getName();

3、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
也许你的答案是在return之前,但往更细地说,我的答案是在return中间执行,请看下面程序代码的运行结果:

Java代码
public  class Test {
public static void main(String[] args) {
      System.out.println(new Test().test());;
}

static int test()
{
        int x = 1;
    try{
        return x;
    }
    finally{
        ++x;
    }
}
}

运行结果是1,为什么呢?主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序 逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。

【要讲清楚这个其实有点复杂~~后续我会单独写一篇博文讲清楚这个~因为我自己也不清楚!】

先随便扯一点:

return obj;
只是 将返回引用(returnPointer),指向了obj 这个引用 指向的对象,
并没有Copy,
虽然,你在 finally 里面,把obj=null;
那只是, obj 这个引用,指向发生了变化,没有影响返回引用(returnPointer)
public class A{
public String m(){
//xxxx代码

return obj;// return obj ,只是把obj 指向的地址,交给 returnAddress; finally 里面的代码,在这步后运行
}
}

//Java会以下面的方式来执行,翻译成下面的

public class A{
public String m(){
//xxxx代码

Object returnPointer=obj;// 你看不见的隐式 引用,Java每个方法,都返回一个 返回
return (String)returnPointer;
}
}

然后:


1. public class FinallyTest
2. {
3. public static void main(String args[])
4. {
5. System.out.println("return: " + new FinallyTest().getString());
6. }
7.
8. public String getString()
9. {
10. String returnString = null;
11. t

Comments are closed.

无觅相关文章插件,快速提升流量