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()