Java继承_隐藏(五)

来源:互联网 发布:mysql的sequence 编辑:程序博客网 时间:2024/06/05 15:06

        隐藏含义:实际上存在,但是对外不可见。

       上文,我们描述了子类对父类方法的重写,叫覆盖(Override),对子类而言,其实父类的方法隐藏了,但是依然存在的。我们可以测试一下:

package com.ws.basic;class GameObject{int life;public GameObject(int life) {super();this.life = life;}public int life_reduce(int ai_reduce){life = life - ai_reduce;return life;}public int life_add(int ai_add){life = life + ai_add;return life;}}class Creature extends GameObject {String mc;int attack;public Creature(String mc, int attack,int life) {super(life);this.mc = mc;this.attack = attack;}public void move() {System.out.println(mc+"在移动!");}public void normal_attack() {System.out.println(mc+"在普通攻击!");}}class Hero extends Creature{String name;String skill;public Hero(String name,String skill,String mc, int attack,int life) {super(mc,attack,life);this.name = name;this.skill = skill;}    // 重写普通攻击方法public void normal_attack(){System.out.println(mc + name + "用火球攻击!");//调用父类的方法,测试是否存在super.normal_attack();}public void skill_attack(){System.out.println(mc + name + "用"+skill+"攻击!");}public void eat_food(int food){life_add(food);System.out.println(mc + name + "吃了"+food + "血,当前血量"+life);}}public class testjc {  public static void main(String[] args) {   Hero heroDfs = new Hero("甘道夫","暴风雪","大法师",14,450); heroDfs.normal_attack();    }}

结果:

大法师甘道夫用火球攻击!大法师在普通攻击!

        可见,重写了子类的方法,父类的方法依然存在,深入理解这个问题,需要对内存分配非常清楚,下文再说。本节主要描述隐藏。
        除了方法存在隐藏,变量同样存在隐藏,简而言之就是,子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量被隐藏,直接看代码:
package com.ws.basic;class GameObject{int life;public GameObject(int life) {super();this.life = life;}public int life_reduce(int ai_reduce){life = life - ai_reduce;return life;}public int life_add(int ai_add){life = life + ai_add;return life;}}class Creature extends GameObject {String mc;int attack;public Creature(String mc, int attack,int life) {super(life);this.mc = mc;this.attack = attack;}public void move() {System.out.println(mc+"在移动!");}public void normal_attack() {System.out.println(mc+"在普通攻击!");}}class Hero extends Creature{String name;String skill;String mc="圣骑士";public Hero(String name,String skill,String mc, int attack,int life) {super(mc,attack,life);this.name = name;this.skill = skill;} public void skill_attack(){System.out.println(mc + name + "用"+skill+"攻击!");}public void eat_food(int food){life_add(food);System.out.println(mc + name + "吃了"+food + "血,当前血量"+life);}}public class testjc {  public static void main(String[] args) {   Hero heroDfs = new Hero("甘道夫","暴风雪","大法师",14,450); heroDfs.skill_attack();    }}

结果:

圣骑士甘道夫用暴风雪攻击!

        可见,如果hero定义了成员变量mc,再调用hero的方法的时候,父类的mc就隐藏了。当然和方法一样,父类的mc依然存在的,只是对子类而言,不可见。简而言之,就是各管各的。



0 0