package think.in.exercise10;
/**
* 第8章 多态
* @author Administrator
* 输出结果表明 :
* Sub的对象,发生向上转型后,调用fistMethod()时,调用的是基类的fistMethod()方法。因为
* Sub类没有这个方法.在基类中的fistMethod()方法中,调用secondMethod()方法时又调用了
* 子类Sub中的secondMethod()方法,而不是基类中的secondMethod()方法.
* 结论:
* 子类对象在发生向上转型后,该对象调用的方法,在子类中不存在,则调用基类的。
* 若该方法存在于子类中,则调用子类的。
* 动手:
* 假设,子类对象没发生向上转型,下面执行的结果与向上转型执行的结果一样么?
* 为什么?
* 原因是:基类的方法firstMethod()是public的,子类在继承基类时,自动继承了该方法
* 假如,基类firstMethod()方法是private的,则语法上就通不过.
* 更奇妙的时,在基类中的firstMethod()方法中调用的secondMethod(),却是子类自己的方法
* 而不是基类的secondMethod()方法.这与向上转型的调用是一致的。
* 结论:
* 无论是否发生向上转型,对复写方法的调用,都是多态调用;即调用对象自己的方法.
* 这也是继承所要的结果,也是程序编写人员的意图。
*
* 提问:
* 什么样的方法可以复写,什么样的方法不可复写,什么样的方法不存在复写
* public, protected, 默认权限方法,可以复写
* final 方法不可以复写
* 静态方法,private方法不存在复写
*/
class Base {
public void firstMethod()
{
System.out.println("this is base.firstMethod()!");
secondMethod();
}
public void secondMethod()
{
System.out.println("this is base.SecondMethond()!");
}
}
class Sub extends Base {
public void secondMethod()
{
System.out.println("this is Sub.SecondMethond()!");
}
}
public class test {
public static void main(String[] args)
{
//向上转型
Base upCast = new Sub();
upCast.firstMethod();
//不向上转型
Sub noCast = new Sub();
noCast.firstMethod();
/**
* 从复写(也叫复盖,复写)与多态
* 首先: final修饰的方法不能复写
* 即超类的方法用,final修饰后,在子类去复写它会编译会提示语法错误.
* 其次: static或者private 修饰的方法,不存在复写
* 即超类的方法用static或者private修饰的方法,在子类中可以存在与超类方法签名一样的方法
* 但它们是只属于各自所在的类,而没有复写关系.
* 并且,private方法,只能类的内部调用,对外部对象是隐藏的,也就不可能发生多态
* 最后:public或protected,或默认的包访问权限,修饰的方法(即普通方法)才能发生复写
* 也就是说没有使用:final,static,private修饰的方法
*
* 多态:包括两个方面,即多种形态,和多个状态。前者是静止的,后者是动态的
* 复写,导致代码的形式上的多态。
* 运行时,根据条件的不同,产生状态上的多态,也即后期邦定。这里的条件是指那个类new出的对象
*/
System.out.println("====================================");
SuperClass testObj = new SubClass();
testObj.StaticMethod();// 提示警告,表示用类来调用该方法,而不要用对象
//testObj.privateMethod();//去掉这个注释提示编译错误
testObj.defaultMethod();
testObj.protectedMethod();
testObj.publicMethod();
/**
* 展示JAVA复写的缺陷(陷井)
*
*/
}
}
//======================================================================================
class SuperClass{
final void FinalMethod()
{
}
public static void StaticMethod()
{
System.out.println("SuperClass.StaticMethod()");
}
private void privateMethod()
{
System.out.println("SuperClass.privateMethod()");
}
void defaultMethod()
{
System.out.println("SuperClass.defaultMethod()");
}
public void publicMethod()
{
System.out.println("SuperClass.publicMethod()");
}
protected void protectedMethod()
{
System.out.println("SuperClass.protectedMethod()");
}
}
class SubClass extends SuperClass{
//提示不能复写超类的,final方法
// final void FinalMethod()
// {
//
// }
public static void StaticMethod()
{
System.out.println("SubClass.StaticMethod()");
}
private void privateMethod()
{
System.out.println("SubClass.privateMethod()");
}
void defaultMethod()
{
System.out.println("SubClass.defaultMethod()");
}
public void publicMethod()
{
System.out.println("SubClass.publicMethod()");
}
protected void protectedMethod()
{
System.out.println("SubClass.protectedMethod()");
}
}