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()'