那么疑问就来了,父类的类方法(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++语言中虚函数的一般方法,而类方法是与其不一样的。这个问题 就像鱼竿是用来钓鱼的,你却问鱼竿能钓鸟吗?“鱼竿能钓鸟”这个想法或者概念真有存在的必要性吗?

参考资料:java的虚拟函数不懂,面试时候老挂,听听王者段位怎么回答的
参考资料:从本质上,认识Java中的重载和重写

最后修改:2022 年 03 月 21 日
如果觉得我的文章对你有用,请随意赞赏