静态方法的继承问题

本文探讨了Java中静态方法的继承与多态特性。通过具体示例代码演示了子类如何隐藏而不是重写父类的静态方法,并分析了不同情况下方法调用的行为差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

  最近看到静态方法的继承问题,看到网上的说法,自己还是有点不太理解,静态方法不是不可以被继承,同样的,静态方法也可以被继承,但是子类对于静态方法的“重写”是通过隐藏父类的静态方法来实现的,所以静态方法可以被继承,但是不能被重写,因此不能实现多态。

  先看父类实例代码:

  

package test;

public class StaticMethodExtendTestParent {
    public static void MethodA(){
        System.out.println("Parent MethodA!");
    }
    public void MethodB(){
        System.out.println("Parent MethodB Call MethodA!");
        MethodA();
    }
    
    public void MethodC(){
        System.out.println("Parent MethodC!");
    }
    public void MethodD(){
        System.out.println("Parent MethodD Call MethodC!");
        MethodC();
    }
}

  在子类中,“重写”了方法A和方法C:

  

package test;

public class StaticMethodExtendTest extends StaticMethodExtendTestParent{
    public static void MethodA(){
        System.out.println("Child MethodA!");
    }
    
    
    public void MethodC(){
        System.out.println("Child MethodC!");
    }
}

  基于以上的情况我们考虑多中情形:

  (1)当我们直接用子类对象调用方法A和方法C

    

public static void main(String[] args) {
        StaticMethodExtendTest child = new StaticMethodExtendTest();
        child.MethodA();
        child.MethodC();

    }

  输出:

  

  和我们平时的理解一样,调用的都是子类的A和C方法,这样看起来静态方法和非静态方法是一样的,好像都将父类的方法进行了重写覆盖。

  (2)父类对象接受子类对象向上转型调用方法A和方法C

    public static void main(String[] args) {

        StaticMethodExtendTestParent parent = new StaticMethodExtendTest();
        parent.MethodA();
        parent.MethodC();
    }

  输出:

  这里我们看到方法C的输出很好的体现了java的多态性质,但是方法A仍然调用的是父类的方法A,这也就是我们前面说的,对于父类的静态方法,子类的“重写”只是将父类的方法隐藏。对于方法C,程序只有在程序运行时才能确定调用的到底是哪个类中实现的方法,有可能是基类的方法,有可能是基类的方法,这取决于StaticMethodExtendTestParent的实例对象接受的是哪一种类(StaticMethodExtendTestParent基类还是子类)。但是对于方法A,在实例对象的类型定义后就已经确定了,如果实例对象为StaticMethodExtendTestParent类型,那么无论对象实际接受的是哪一个子类的对象,方法A的调用始终是StaticMethodExtendTestParent的A方法。在上述实例中如果子类没有MethodA方法,那么子类对象对A方法的调用都将调用父类的A方法,所以静态方法可以被继承,但是不能被重写,无法实现多态

 (3)通过子类对象在父类的方法中调用被子类“重写”的方法

  

public static void main(String[] args) {
        StaticMethodExtendTest child = new StaticMethodExtendTest();
        child.MethodA();
        child.MethodB();
        child.MethodC();
        child.MethodD();
        System.out.println("=====================");
        StaticMethodExtendTestParent parent = new StaticMethodExtendTest();
        parent.MethodA();
        parent.MethodB();
        parent.MethodC();
        parent.MethodD();
    }

测试结果:

  这里直接测试了两种情况,可以看出无论子类有没有向上转型,当调用父类方法时B,B中有对静态方法A的调用,都是直接调用的父类的静态方法A,方法D和C的调用则是我们熟知的多态的情形。

  

转载于:https://www.cnblogs.com/leo-song/p/7828284.html

### Java静态方法继承行为特点 #### 静态方法的概念 静态方法是由 `static` 关键字修饰的方法,它属于类而不是某个具体的实例。因此,可以通过类名直接调用该方法而无需创建对象[^4]。 #### 静态方法继承的关系 尽管静态方法可以被子类继承,但它并不表现出典型的面向对象特性(如多态)。以下是关于静态方法继承中的具体行为: 1. **不可覆盖** 子类无法真正“重写”父类的静态方法。如果子类定义了一个与父类同名的静态方法,则这实际上是一个新的方法,而非对父类方法的覆盖。这种现象被称为隐藏(hiding),即子类的静态方法会隐藏父类的静态方法[^3]。 2. **通过类名调用** 调用静态方法时推荐使用类名加上方法名的形式。即使通过子类的对象去调用父类的静态方法,实际执行的是父类的静态方法。 3. **内存分配** 静态方法在内存中仅有一份副本,无论有多少个类的实例存在,它们都共享这一份静态方法资源。这意味着静态方法的行为不会因不同的对象状态而改变。 #### 示例代码展示 下面是一段演示静态方法继承特性的代码: ```java class Parent { public static void display() { System.out.println("这是Parent类的display方法"); } } class Child extends Parent { public static void display() { System.out.println("这是Child类的display方法"); } public static void main(String[] args) { Parent p = new Child(); p.display(); // 输出:这是Parent类的display方法 Child c = new Child(); c.display(); // 输出:这是Child类的display方法 Parent.display(); // 输出:这是Parent类的display方法 Child.display(); // 输出:这是Child类的display方法 } } ``` 上述例子表明,当通过父类引用调用静态方法时,运行的结果取决于引用所属的类型,而不是实际对象的类型。 #### 总结 - 静态方法不属于任何特定实例,而是归属于整个类。 - 子类虽然能继承父类的静态方法,但不能对其进行真正的重写,只能隐藏。 - 推荐始终使用类名来调用静态方法以避免混淆。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值