20180315 java java面向对象-多态时方法的调用问题
在多态时方法调用问题的前提是 必须存在多态情况,即子类对象赋给父类变量。
存在父类:SuperClass 子类 SubClass 方法:doWork
//父类
class SuperClass
{
}
//子类
class SubClass extends SuperClass
{
}
class MethodCallDemo{
public static void main(String[] args)
{
System.out.println("Hello");
}
}
当主函数中有以下语句:
SuperClass clz = new SubClass();
clz.doWork();//此时会输出
情况一:
当doWord()方法存在于SuperClass(主类)中,而不存在于子类中,即:
//父类
class SuperClass
{
public void doWork()
{System.out.println("SuperClass.doWork()...");}
}
//子类
class SubClass extends SuperClass
{
}
class MethodCallDemo{
public static void main(String[] args)
{
SuperClass clz = new SubClass();
clz.doWork();//此时会输出 SuperClass.doWork()...
}
}
此时执行结果是: 编译通过,执行 SuperClass的doWork(),执行过程是先从SubClass中找doWork()方法,找不到,再去SuperClass中找doWork()方法。
情况二:
当doWord()方法存在于SubClass(子类)中,而不存在于父类中,即:
//父类
class SuperClass
{
}
//子类
class SubClass extends SuperClass
{
public void doWork()
{System.out.println("SubClass.doWork()...");}
}
class MethodCallDemo{
public static void main(String[] args)
{
SuperClass clz = new SubClass();
clz.doWork();//此时编译错误
}
}
此时执行结果是: 编译报错,编译时期会去编译类型(SuperClass)中找是否有doWork方法:
找到: 编译通过;
找不到:编译报错。
情况三:
当doWord()方法既存在于SubClass(主类)中,也存在于父类中,即:
//父类
class SuperClass
{
public void doWork()
{System.out.println("SuperClass.doWork()...");}
}
//子类
class SubClass extends SuperClass
{
public void doWork()
{System.out.println("SubClass.doWork()...");}
}
情况四:
当doWord()方法既存在于SubClass(主类)中,也存在于父类中,但doWork是静态方法,此时叫做隐藏,而不叫方法覆盖,即:
//父类
class SuperClass
{
static public void doWork()
{System.out.println("SuperClass.doWork()...");}
}
//子类
class SubClass extends SuperClass
{
static public void doWork()
{System.out.println("SubClass.doWork()...");}
}
class MethodCallDemo{
public static void main(String[] args)
{
SuperClass clz = new SubClass();
clz.doWork();//编译通过,输出 SuperClass.doWork()...
}
}
此时执行结果是: 编译通过,输出 SuperClass.doWork()... 因为静态方法和对象一点关系都没有,它只用编译类型调用。
静态方法的调用只需要类即可,如果使用对象来调用静态方法,其实使用的是对象的编译类型来调用静态方法。