以下程序的输出结果为
class base{
public base(String s){
System.out.print("B");
}
}
public class Derived extends base{
public Derived (String s) {
System.out.print("D");
}
public static void main(String[] args){
new Derived("C");
}
}
A:BD
B:DB
C:C
D:编译不通过
这道题我一开始选中的A选项,这里也确实容易错,但答案是D,下面让我们来分析一下。
首先我们都知道实例化子类之前会先实例化父类的构造方法。如果说按照这个逻辑,那我们就会先输出B,再输出D,答案成A了?不不不,别忘了,super(),子类的构造方法的第一行都有一个默认的super(),super()会调用父类的无参构造,但是在这个里面我们父类自己定义了一个有参构造,所以我们不会默认生产无参构造,所以就无法实例化我们的子类。想要成功通过编译的话,需要在子类构造方法中加super("这里传参数"),或者是在父类中我们自己再定义一个无参构造。
初始化顺序依次是:(静态变量、静态初始化块)–>(变量、初始化块)–> 构造器;如果有父类,则顺序是:父类static方法 –> 子类static方法 –> 父类构造方法- -> 子类构造方法
有关下述Java代码描述正确的选项是( )
public class TestClass {
private static void testMethod() {
System.out.println("testMethod");
}
public static void main(String[] args){
((TestClass)null).testMethod();
}
}
A:编译不通过
B:运行正常,输出testMethod
C:编译通过,运行异常,报NullPointerException
D:编译通过,运行异常,报NoSuchMethodException
刚开始看到这个题目的时候心里就在想null在这里是什么鬼,还可以这样子用??反手就一个编译不通过。结果。。。答案为B。what'up?!一步一步来,首先我们都知道static代表静态方法,静态方法可以通过类名直接访问。且静态方法在类实例化之前就已经加载完了,所以静态方法不能调用非静态方法,但非静态方法可以调用静态方法。接着null是可以被强制转换成任何类型的!!!



