您的位置:首页 > 编程语言 > Java开发

think in java 第8章 多态

2012-07-05 14:56 363 查看
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()");
}
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: