表面类型:对象声明时的类型;
实际类型:对象产生时的类型;
Base[表面类型]base=new Sub[实际类型]();
那么在继承关系中,方法时如何执行的呢?例子如下:
public class StaticTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Base base=new Sub();
base.doSomeThing1();
base.doSomeThing();
}
}
class Base{
public static void doSomeThing()
{
System.out.println("Base method---doSomeThing");
}
public void doSomeThing1()
{
System.out.println("Base method---doSomeThing1");
}
}
class Sub extends Base{
public static void doSomeThing()
{
System.out.print("Sub method---doSomeThing");
}
@Override
public void doSomeThing1()
{
System.out.print("Sub method---doSomeThing1");
}
}
------------------
Sub method---doSomeThing1
Base method---doSomeThing
我们发现静态方法竟然执行的不是子类中的方法,这是由于:
非静态方法是按照实际类型执行的;
静态方法是按照表面类型来执行的;
但是,通过子类构建与父类完全相同的静态函数,这中行为叫做“隐藏”,其目的就是抛弃父类的静态方法,重显子类方法。