黑马程序员技术交流社区

标题: java 继承:子父类中出现同名变量、函数时解析 含示例代码 [打印本页]

作者: fmi110    时间: 2015-7-1 11:33
标题: java 继承:子父类中出现同名变量、函数时解析 含示例代码
本帖最后由 fmi110 于 2015-7-1 11:37 编辑

继承的部分有关知识
  1. /**
  2. 继承二:子父类出现后,类成员的特点:
  3.          
  4.                 类中的成员有:
  5.                 1、变量
  6.                 2、函数
  7.                 3、构造函数

  8.                 1、变量:
  9.                         如果子类中出现非私有的同名成员变量时,
  10.                         子类要访问本类的变量,用 this.变量 或 变量
  11.                         子类要访问父类的变量,用 super.变量

  12.                 2、函数:
  13.                         当父类子类中出现一模一样的(同名?)函数时,
  14.                         子类对象调用该函数时,会运行子类函数的内容
  15.                         如同父类的函数被覆盖一样(其实此时子类中该函数可通过 super.函数名 调用父类函数)
  16.                        
  17.                         这种情况时函数的另一特性:重写(覆盖)

  18.                         当子类继承父类的方法,但是子类的方法包含功能内容与父类不完全一致,
  19.                         这是并不需要定义新功能,而是使用覆盖特殊,保留父类的功能定义,并重写功能内容

  20.                         覆盖:
  21.                                 1、子类覆盖父类,必须保证子类的访问权限大于或等于父类权限
  22.                                 2、静态只能覆盖静态

  23.                         重载与重写(覆盖的区别):
  24.                                 重载:重在参数列表,跟其他无关
  25.                                 重写:子父类方法要一模一样(访问权限不算),包括返回类型,方法名,方法参数。

  26.                                         (1)子父类的仅返回类型不同时,编译错误:
  27.                                                         父类为        int show();
  28.                                                         子类为        void show();
  29.                                                         则对象(假设能建立)同时有 int show();void show();肯定编译失败

  30.                                         (2)参数不一样时,其实就相当于函数重载了!??
  31. */

  32. class Fu
  33. {
  34. //        private int num = 7; //私有化后,不能被子类访问
  35.         int num = 8;

  36.         /**同名函数Demo部分,说明函数的覆盖*/
  37.         //public void speak() //子类中也有speak()方法时,子类的show访问权限要不低于父类
  38.        
  39.         void speak()
  40.         {
  41.                 System.out.println("speak输出的这部分来自于Fu类");
  42.         }
  43.         /**用于说明函数的重载 */
  44.         void reLoad(int num)
  45.         {
  46.                 System.out.println("现在载入的是父类中的reLoad方法\n");
  47.         }
  48.                
  49. }

  50. class Zi extends Fu
  51. {
  52.         /**同名变量Demo部分*/
  53.         int num = 9;

  54.         void show()
  55.         {
  56.                 System.out.println("this.num 输出自身变量 num = "+num);
  57.                 System.out.println("super.num 输出父类中的变量 num = "+ super.num);
  58.                 System.out.println();
  59.         }

  60.         /**同名函数Demo部分,说明函数的覆盖*/
  61.         void speak()
  62.         {
  63.                 super.speak();  //调用了父类中的方法,相当于把父类的方法包含进来了
  64.                 System.out.println("\nspeak输出的这部分,是子类中新增加的\n");
  65.         }
  66.         /**用于说明函数的重载 */
  67.         void reLoad(int num,int n)
  68.         {
  69.                 System.out.println("现在载入的是子类中的reLoad方法");
  70.         }
  71. }


  72. class ExtendsDemo2
  73. {
  74.         public static void main(String[] args)
  75.         {

  76.                 Zi z = new Zi();  /**new 时,先加载Fu类,然后加载Zi类*/
  77.                 System.out.println("\n*****************************************************\n");

  78.                 z.show();                /**用于说明继承后 同名变量的特点*/

  79.                 System.out.println("\n*****************************************************\n");

  80.                 z.speak();     /**用于说明继承后 同名函数的覆盖(可以包含父类的功能并增加功能)*/

  81.                 System.out.println("\n*****************************************************\n");
  82.                 /**用于说明函数的重载 */
  83.                 z.reLoad(1);      
  84.                 z.reLoad(1,2);
  85.         }
  86. }
复制代码






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2