105. Java 继承 - 静态方法的隐藏

105. Java 继承 - 静态方法的隐藏

在 Java 中,当子类定义了一个与父类静态方法签名相同的静态方法时,子类中的静态方法将 隐藏 父类中的静态方法。与实例方法的重写不同,静态方法是通过类本身来调用的,因此它们的调用与对象的实例化状态无关。

静态方法与实例方法的区别
  1. 实例方法的重写:当子类重写父类的实例方法时,调用的是子类版本的实例方法,即使使用的是父类类型的引用变量,实际调用的是子类的实例方法。
  2. 静态方法的隐藏:当子类定义一个与父类静态方法签名相同的静态方法时,调用的版本取决于方法是通过父类还是子类来调用的。即静态方法是根据调用它的类来确定的,而不是根据实例对象。
示例代码
java 复制代码
public class Animal {
    public static void testClassMethod() {
        System.out.println("The static method in Animal");
    }
    
    public void testInstanceMethod() {
        System.out.println("The instance method in Animal");
    }
}

public class Cat extends Animal {
    public static void testClassMethod() {
        System.out.println("The static method in Cat");
    }
    
    public void testInstanceMethod() {
        System.out.println("The instance method in Cat");
    }

    public static void main(String[] args) {
        Cat myCat = new Cat();
        Animal myAnimal = myCat;
        
        // 调用静态方法
        Animal.testClassMethod(); // 输出:The static method in Animal
        Cat.testClassMethod();    // 输出:The static method in Cat
        
        // 调用实例方法
        myAnimal.testInstanceMethod(); // 输出:The instance method in Cat
        myCat.testInstanceMethod();    // 输出:The instance method in Cat
    }
}
程序输出解释
  1. Animal.testClassMethod() 调用 :此时通过父类 Animal 来调用静态方法,因为静态方法是通过类名来调用的,因此调用的是 Animal 类中的 testClassMethod(),输出:"The static method in Animal"。
  2. Cat.testClassMethod() 调用 :此时通过子类 Cat 来调用静态方法,输出的是子类 Cat 中的 testClassMethod(),即输出:"The static method in Cat"。
  3. 实例方法的调用testInstanceMethod() 是实例方法,因此无论通过 Animal 类型的引用变量 myAnimal 还是通过 Cat 类的实例变量 myCat 来调用,它们都会调用 Cat 类中的 testInstanceMethod() 方法,因为实例方法的重写是根据对象的实际类型来决定的。
静态方法与实例方法的调用区别
  • 静态方法的调用 :静态方法是通过类来调用的,而不是通过对象。因此,调用静态方法时,使用的是类名来决定调用哪个方法。如果父类和子类都有同名静态方法,那么静态方法是 隐藏 的,具体调用哪个版本的方法,取决于调用者使用的是哪个类名。
  • 实例方法的调用:实例方法的调用是根据实际对象的类型来决定的。如果子类重写了父类的实例方法,那么实际调用的是子类的方法。
总结
  1. 静态方法的隐藏:如果子类定义了一个与父类静态方法签名相同的静态方法,子类的方法将隐藏父类的方法。静态方法是通过类名调用的,调用哪个方法取决于类名,而不是对象实例。
  2. 实例方法的重写:子类可以重写父类的实例方法,并且在调用时,调用的是实际对象的类型对应的方法(即子类重写的方法)。
  3. 关键区别:静态方法的版本由调用的类决定,而实例方法的版本由实际对象的类型决定。

通过这个示例和详细的解释,学员可以清楚地了解静态方法隐藏与实例方法重写的区别,以及它们在实际编码中的应用。

相关推荐
乘风gg5 分钟前
为什么AI 时代来临,大部分人吃不到红利
前端·ai编程·claude
恋猫de小郭27 分钟前
Android 限制侧载新进展,谷歌联合国内厂商推验证计划
android·前端·flutter
IT_陈寒33 分钟前
Redis内存爆了,原来我漏掉了这个致命配置
前端·人工智能·后端
恋猫de小郭34 分钟前
解读 Android 17 全新内存限制,有没有“豁免”后门?
android·前端·flutter
fliter1 小时前
最后一块拼图:用 bitvec 构造 IPv4 包,真正做出自己的 Ping
后端
Hyyy2 小时前
理解LLM的基本工作原理:预训练、微调、推理的区别
前端
fliter2 小时前
用 Rust 解析并生成 ICMP 包:checksum、nom 与 cookie-factory
后端
Gatlin2 小时前
前端逆向与反逆向:一场猫鼠游戏的底层逻辑与实战
前端
蝎子莱莱爱打怪2 小时前
XZLL-IM干货系列 03|消息 ID 设计:一个 UUID 搞不定的事,我用两个 ID 解决了
后端·面试·开源
fliter2 小时前
从 panic 到 Result:用 Rust 重新整理一个 ping 项目的错误处理
后端