这个继承与静态代码块面试考试简直是必须出现的,今天总结一下,整理思路。
在effective Java中关于继承的讨论,有关于构造器的讨论,结论是你超类(父类)好好设计,不要被继承你的子类增加一些不必要的负担。同样继承的时候也要注意,尤其是重写方法时可能由于勾走爱情造成一些可能始料不及的问题。
首先我们要了解一下类(子类)加载的过程:
Class Son extend Father
一 加载顺序
子类son加载的过程
第一步骤:
静态块加载(父类静态块加载 ——》 子类静态块加载)
第二步骤:
构造器加载 (父类无参构造器 ——》 静态构造器(有参或者无参) )
代码:
public class Test01 {
public static void main(String[] args) {
//创建子类
Son son = new Son();
System.out.println("==========");
Son son2 = new Son("son");
}
}
class Father{
public Father() {
System.out.println("father的无参构造方法");
}
}
class Son extends Father{
private String name;
public Son() {
System.out.println("son的无参构造方法");
}
public Son(String name) {
this.name = name;
System.out.println("son的有参构造方法");
}
}
public class Test01 {
public static void main(String[] args) {
//创建子类
Son son = new Son();
System.out.println("==========");
Son son2 = new Son("son");
}
}
class Father{
public Father() {
System.out.println("father的无参构造方法");
}
static {
System.out.println("father的静态代码块");
}
}
class Son extends Father{
private String name;
static {
System.out.println("son的静态代码块");
}
public Son() {
System.out.println("son的无参构造方法");
}
public Son(String name) {
this.name = name;
System.out.println("son的有参构造方法");
}
}
问题二 子类构造器加载
子类加载会在加载一下父类无参的构造方法,参见说上的打印日期的例子。
书上的例子,其实你了解上面的顺序,你就对这个结果一点也不疑问,书上讲这个就是告诉你在重写父类方法时,由于父类构造器先调用,如果父类构造器调用了你重写的方法,可能在子类加载时会出现一些状况外的结果,比如第一个为什么是null,告诉你继承的类不是简单一个extends就OK了,你要考虑方法的重写,子类加载父类会不会给子类挖坑。
package com.zp.eejava4;
public class Super {
public Super(){
ovarrideMe();
}
public void ovarrideMe(){
}
}
package com.zp.eejava4;
import java.util.Date;
public final class Sub extends Super{
private final Date date;
Sub(){
date = new Date();
}
@Override
public void ovarrideMe() {
System.out.println(date);
}
public static void main(String[] args) {
Sub sub = new Sub();
sub.ovarrideMe();
}
}