《Java 2实用教程》P130 “重写的语法规则:如果子类可以继承父类的某个方法,那么子类就有权利重写这个方法(不包括final方法)
那么疑问就来了,父类的类方法(static方法)可以被子类继承和重写吗?
实践一下看看
class Father {
void a() {
System.out.println("父类的实例方法");
}
static void b() {
System.out.println("父类的类方法");
}
}
class Baby extends Father {
void a() {
System.out.println("子类重写的实例方法");
}
static void b() {
System.out.println("子类重写的类方法");
}
}
public class Te {
public static void main(String[] args) {
Baby i = new Baby();
i.a();
i.b();
}
}
//运行结果是:
//子类重写的实例方法
//子类重写的类方法
显然,子类的重写的类方法是可以覆盖父类的类方法的。既然这里用了继承,那么换向上转型试试这个 问题,把23行Baby i = new Baby();
换成Father i = new Baby();
class Father {
void a() {
System.out.println("父类的实例方法");
}
static void b() {
System.out.println("父类的类方法");
}
}
class Baby extends Father {
void a() {
System.out.println("子类重写的实例方法");
}
static void b() {
System.out.println("子类重写的类方法");
}
}
public class Te {
public static void main(String[] args) {
Father i = new Baby();
i.a();
i.b();
}
}
//运行结果是:
//子类重写的实例方法
//父类的类方法
咦,子类对象的向上转型是无法重写父类的类方法的。为什么呢?按我的理解,类方法是随着字节码文件加载到内存就分配好了对应入口地址,其调用是不受对象的创建影响,只受静态类型的影响。上面代码1中Baby i = new Baby();
的引用是Baby类型的,所以运行结果是子类“重写”的类方法覆盖了父类类方法,而代码2Father i = new Baby();
是把Baby类型的i对象的引用放到Father的对象里面,实体是Baby类创建的,其引用中是不包含类方法的人口地址的,所以i.b()调用的就是Father类的类方法。
所以我认为子类是可以继承父类的类方法,因为java的继承是根据类的树形结构的一个特性。但不存在”重写类方法“这个概念,重写的实质是操作类似于c++语言中虚函数的一般方法,而类方法是与其不一样的。这个问题 就像鱼竿是用来钓鱼的,你却问鱼竿能钓鸟吗?“鱼竿能钓鸟”这个想法或者概念真有存在的必要性吗?