Java面试之NULL

1、下面程序能正常运行吗?

public class NULL {

    public static void haha(){
        System.out.println("haha");
    }


    public static void main(String[] args) {
        ((NULL)null).haha();
    }

}

能正常运行。输出为haha,因为null值可以强制转换为任何java类类型,(String)null也是合法的。但null强制转换后是无效对象,其返回值还是为null,而static方法的调用是和类名绑定的,不借助对象进行访问所以能正确输出。反过来,没有static修饰就只能用对象进行访问,使用null调用对象肯定会报空指针错了。

2、下面代码的结果是什么?

public class Test {

    public void myMethod(String str) {
        System.err.println("string");
    }

    
    public void myMethod(Object obj) {
        System.err.println("object");
    }

    public static void main(String[] args) {
        Test t = new Test();
        t.myMethod(null);
    }

}

这道题考察重载方法参数具有继承关系时的调用问题,还有对null的认识。如果是一般具有继承关系的对象分别作为参数,看对象的引用,如:

class A {}

class B extends A {}

public class Test {

    public static void main(String[] args) {
        A b1 = new B();
        B b2 = new B();
        get(b1);// A
        get(b2);// B
    }

    public static void get(A a) {
        System.out.println("A");
    }

    public static void get(B a) {
        System.out.println("B");
    }

}

Object是一切类的父类,具有继承关系,那null是指向什么呢?null是任何引用类型的初始值,String和Object的初始值都是null,但是null会优先匹配引用类型参数为String的方法,因此这道题答案是string。假设这道题中还有其他同是引用类型的重载方法呢?如:

public void myMethod(Integer obj) {
    System.err.println("Integer");
}

如果是这样的话,调用这个方法传入参数null时会报错,他不知道选哪个方法进行匹配调用了。

猜你喜欢

转载自blog.csdn.net/qq_34988624/article/details/85254500