继承中的实例变量、静态变量、实例方法、静态方法被隐藏和被覆盖问题
程序员文章站
2024-03-22 09:15:22
...
父类中的静态变量、实例变量、静态函数这三种会被子类的同名的静态变量、实例变量、静态方法所隐藏。
父类中的实例方法会被子类相同的实例方法(重写的方法)所覆盖。
所谓隐藏就是还有被运行的机会,覆盖基本已经玩完(但是也可以通过super进行调用)。
下面通过一段代码进行详细的了解:
package T1;
import java.util.*;
class C{
public int i=10;
public static int j=100;
public void f() {
System.out.println("C的f函数");
}
public static void f1() {
System.out.println("C的静态f1函数");
}
}
class B extends C{
public int i=9;
public static int j=90;
public void f() {
System.out.println("B的f函数");
}
public static void f1() {
System.out.println("B的静态f1函数");
}
}
public class A {
public static void main(String args[]) {
B b=new B();
b.f();
b.f1();
System.out.println("实例变量i="+b.i);
System.out.println("静态变量j="+b.j);
System.out.println("///////////////分界线呀");
C c=new B();
c.f();
c.f1();
System.out.println("实例变量i="+c.i);
System.out.println("静态变量j="+c.j);
}
}
B的f函数
B的静态f1函数
实例变量i=9
静态变量j=90
///////////////分界线呀
B的f函数
C的静态f1函数
实例变量i=10
静态变量j=100
分界线前面的那种就是直接使用子类的对象,那么父类的四种类型该隐藏的隐藏,该覆盖的覆盖。
分界线后面的使用的是一个父类指向了一个子类,那么那些被隐藏的静态变量、实例变量、静态方法就会被唤醒,也就是使用的是父类的,那个被覆盖的实例方法将不会被执行,仍然使用的是被覆盖后的,也就是子类中的。