Java真实笔试题一

PS:昨天去笔试后,发现自己对于JavaSE的基础部分还是有些薄弱的地方,特将昨天自己不是太清楚的地方记录下来,巩固基础。

子类继承父类静态方法的问题

public class Study {
    public static void main(String[] args) {
        Super sup = new SubClass();
        sup.say();
        sup.a();

        SubClass sub = new SubClass();
        sub.say();
        sub.a();
    }
}

class Super {
    public static void say() {
        System.out.println("I am super");
    }

    public void a() {
        System.out.println("super a");
    }
}

class SubClass extends Super{
    public static void say() {
        System.out.println("I am sub");
    }

    @Override
    public void a() {
        System.out.println("sub a");
    }
}

  题目就是问上面的输出结果,这里主要考察的就是子类对于父类静态方法是如何继承的。首先子类能够继承父类的静态方法,但是子类不能够重写父类的静态方法,这就意味着如果如果子类有一个和父类同名且方法签名相同的方法,那么此时子类会隐藏父类的该方法,我们知道多态的机制靠的就是子类重写父类的方法,然后用父类的引用指向子类的对象,用父类的引用调用子类的方法。此时,该静态方法只是被隐藏了,没有被重写,那么在该方法上就没有实现多态。(上面的代码是在IDEA里编写的,在编写的过程也能发现子类对父类的静态方法没有重写,没有提示加@Override注解)

  所以上面的输出是:

I am super
sub a
I am sub
sub 

Java中类初始化的问题

 问:下面代码的输出结果?

package com.yunche;

/**
 * @ClassName: Study
 * @Description:
 * @author: yunche
 * @date: 2018/12/05
 */
public class Study {
    public static void main(String[] args) {
        SubClass subClass = new SubClass();
    }
}

class Super {
    static{
        System.out.println("super:clinit()");
    }

   Super() {
       System.out.println("super:init()");
   }
}

class SubClass extends Super{
    static{
        System.out.println("SubClass:clinit()");
    }

    SubClass() {
        System.out.println("SubClass:init()");
    }
}

  此题考查类的初始化顺序,先将父类的 clinit() 方法执行完,再执行子类的 clinit()方法,然后执行父类的 init() 方法,最后执行子类的 init() 方法。所以结果为:

super:clinit()
SubClass:clinit()
super:init()
SubClass:init()
原文地址:https://www.cnblogs.com/yunche/p/10069205.html