Java方法的覆盖(Overriding )针对的是实例方法(即非静态方法),而方法的隐藏(Hiding)针对的是类方法(即静态方法)。
方法的覆盖和隐藏指的是子类对从父类继承的方法进行重写。子类和父类的方法名称相同、返回值相同、形参列表相同。
被覆盖的方法,子类型被转换为父类型后,调用的是子类的方法。
被隐藏的方法:1)如果类型定义是子类型,那么调用的是子类型的静态方法(父类方法被隐藏);2)如果类型定义是父类型,那么调用的是父类的静态方法。
代码示例,下面定义了一个父类ClassOne、一个子类ClassTwo,一个主类Test1:
// 父类
package com.thb;
public class ClassOne {
public void method1() {
System.out.println("在父类的函数method1中");
}
public static void method2() {
System.out.println("在父类的静态函数method2中");
}
}
// 子类
package com.thb;
public class ClassTwo extends ClassOne {
@Override
public void method1() {
System.out.println("在子类的函数method1中");
}
public static void method2() {
System.out.println("在子类的静态函数method2中");
}
}
// 主类
package com.thb;
public class Test1 {
public static void main(String[] args) {
ClassOne one = new ClassOne(); // 变量类型是父类,引用指向父类
ClassOne two = new ClassTwo(); // 变量类型是父类,引用指向子类
System.out.println("变量类型是父类,引用指向父类:");
one.method1(); // 调用父类的方法
one.method2(); // 调用父类的静态方法
System.out.println("--------------------------");
System.out.println("变量类型是父类,引用指向子类:");
two.method1(); // 子类覆盖父类的方法
two.method2(); // 父类的静态方法不被隐藏
System.out.println("--------------------------");
System.out.println("变量类型都是父类,将指向子类引用的变量赋值给父类型变量:");
one = two;
one.method1(); // 子类覆盖父类的方法
one.method2(); // 父类的静态方法不被隐藏
System.out.println("--------------------------");
System.out.println("变量类型是子类,引用指向子类:");
ClassTwo two2 = new ClassTwo();
two2.method1(); // 子类覆盖父类的方法
two2.method2(); // 父类的静态方法被隐藏
System.out.println("--------------------------");
System.out.println("将子类型变量赋值给父类型变量:");
one = two2;
one.method1(); // 子类覆盖父类的方法
one.method2(); // 父类的静态方法不被隐藏
}
}
执行结果: