之前我们在说子类关于父类之间联系与关系时,都是在说普通方法。最近刚好在网上看到的一个问题,于是自己找了下答案,也亲自做了个小dome。
先说结论:如果父类和子类都有相同的静态成员方法时,父类变量就执行父类静态成员;子类变量就执行子类静态成员。如果子类没有相应的静态成员方法,子类变量就执行父类的静态成员。
分析:
1、子类继承父类的时候,会在子类的构造函数中调用父类的构造函数,这是一个很关键的地方,这意味着子类是通过父类的构造函数来继承获取父类的成员(变量和方法)。而Static关键字修饰的内容是属于类的,优先于类对象的创建而创建。也就是子类如果创建了一个和父类一样的静态成员,父类再通过子类对象将父类的该静态成员遗传给子类,应该是会覆盖子类的静态成员。这样的话子类的子类也会被子类的静态成员所覆盖,应该会导致所有子类都使用同一个父类静态成员(静态成员传导)。
2、根据多态原理,父类变量接收子类对象时如果父类的静态成员被子类覆盖应该调用子类的静态成员(多态)。
1和2形成冲突。实际测试中,通过一个demo——Father,Son,GrandSon中均定义各自的相同静态方法,改写方法体中的内容,然后使用多态对各个方法进行调用,再使用本身的类对象进行调用,其结果是:如果子类重写了父类的静态方法,使用多态由父类变量接收子类对象时,该父类变量调用的是父类自己的静态方法(没有多态);如果子类重写了父类的静态方法,使用子类本身类型的变量接收子类的对象,子类调用自己的静态方法(没有传导);如果子类没有重写父类的静态方法,使用子类本身类型的变量接收子类的对象会调用父类的静态方法(继承)。