JAVA中隐藏与覆盖

覆盖:子类重写父类的方法,要求方法名和参数类型完全一样(参数不能是子类),返回值和异常比父类小或者相同(即为父类的子类),访问修饰符比父类大或者相同。

隐藏:父类和子类拥有相同名字的属性或者方法( 方法隐藏只有一种形式,就是父类和子类存在相同的静态方法)时,父类的同名的属性或者方法形式上不见了,实际是还是存在的。

JAVA中方法和变量在继承时的覆盖和隐藏规则

  • 父类的实例变量和静态变量能被子类的同名变量隐藏
    class Parent2 {
        public int age;//实例变量
        public static String name;//静态变量
    }
    
    class Child2 extends Parent2{
        public int age;
        public static String name;
    }
    
  • 父类的静态方法被子类的同名静态方法隐藏
  • 父类的实例方法被子类的同名实例变量覆盖
    package com.lvqiang.principle.singleResponsibilityPrinciple.code;
    
    /**
     * @Auther: lvqiang
     * @Description: 区分隐藏与覆盖, 在多态使用中 子类和父类中有静态方法和静态变量 是怎样调用的?
     */
    public class CoverPolymorphic2 {
        public static void main(String[] args) {
            Parent2 parent2 = new Child2();
            System.out.println(parent2.getAge());   //25
            System.out.println(parent2.getName());  //parent
            Child2 child2 = new Child2();
            child2.print();     //child     parent
        }
    
    }
    
    class Parent2 {
        public int age = 45;
        public static String name = "parent";
    
        public int getAge() {
            return age;
        }
    
        public static String getName() {
            return name;
        }
    }
    
    class Child2 extends Parent2 {
        public int age = 25;
        public static String name = "child";
    
        @Override
        public int getAge() {
            return age;
        }
    
        public static String getName() {
            return name;
        }
    
        public void print() {
            System.out.println(getName());
            System.out.println(super.getName());
        }
    }
    /**
     * 值得注意的是,当使用多态调用普通方法时,毫无疑问运行的是子类中同名的方法,因为此时,子类重写了父类中的方法。
     * <p>
     * 而当同名方法为静态时,再进行调用此时运行的是却是父类中的getName(),这表明对于同名静态方法 子类不会对父类同名方法进行重写,
     * 从代码上可以看出getName()也未写重载的注解 ,如果强行加上重载注解则报错:Method does not Override method from is spercles
     * 很明显该方法无法覆盖父类方法。
     * <p>
     * 结论:这两个方法应该根本无联系,针对静态方法,是可以继承的但是子类无法重写(这涉及到类加载顺序,会在类加载时将静态方法加载入方法区中)。
     * 在《java编程思想》中也指出”只有普通的方法调用可以是多态的“
     */
    

注意!!!

1.不能用子类的静态方法****隐藏 父类中同样的实例方法

2.不能用子类的实例方法****覆盖 父类中同样的静态方法

3.这点儿请注意,就是变量只会被****隐藏 不会被覆盖 ,无论他是实例变量还是静态变量,而且,子类的静态变量可以隐藏 父类的实例变量,子类的实例变量可以隐藏 父类的静态变量

class Parent2 {
    public String name;

    public String getName() {
        return name;
    }
}

class Child2 extends Parent2{
    public static String name;

    public static String getName() {
        return name;
    }
}

**将报 静态方法无法覆盖实例非静态方法 **Static method 'getName()' cannot override instance method 'getName()'


标题:JAVA中隐藏与覆盖
作者:JonLv
地址:http://39.108.183.139:8080/articles/2023/03/11/1678547901703.html