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()"); } }
相关文章推荐
- [think in java] 第8章 多态
- [think in java] 第8章 多态
- think in java 第8章 多态 ------ 复盖私有方法的缺陷
- Think in java 第八章 多态 第九章 接口 第十章 内部类
- 看完think in java第8章后的想法以及对java 1.5以后版本泛型的学习笔记
- 《Think in Java》(八)多态
- 《Thinkinginjava》第8章-多态
- Think In Java 多态学习
- Thinking in Java 4th - 第8章 多态
- Thinking in Java 第8章 多态
- [Think In Java]基础拾遗2 - 多态、反射、异常、字符串
- Think In Java 读后感
- Think in java 答案_Chapter 4_Exercise 2
- Think in java 答案_Chapter 4_Exercise 19
- think in java - concurrency - Callable
- think in java interview-高级开发人员面试宝典代码示例
- [think in java]第10章 内部类
- 运行 Think In Java中的 RMI 示例可能产生的几种异常及解决
- Think in Java 读书笔记(1)
- 关于think in java学习笔记的说明