方法和变量在继承时的覆盖和隐藏问题

  

  作者:华清远见讲师

  最近有个同学问了我一个小问题,觉得很有意思,之前一直没有想到过。他说“java中存在方法覆盖,是否存在变量的覆盖呢?”。我们知道,在java中,子类可以继承父类,如果子类声明的方法与父类有重名,这时就发生了方法覆盖。其实,这实际上这又分为两种情况,就是方法和变量在继承时的覆盖和隐藏问题,这些概念性的东西看似无聊,但是在面试中还是比较常见的,所以这里来讨论下

  首先我们来看几个概念

  隐藏 :子类隐藏了父类的变量和方法,那么,子类不能访问父类被隐藏的变量或者方法,但是,将子类转换成父类,可以访问父类被隐藏的变量或者方法

  覆盖 :子类覆盖了父类的变量或者方法,那么,子类不能访问父类被覆盖的变量或者方法,将子类转换成父类后同样不能访问父类被覆盖的变量或者方法

  首先看一下JAVA中方法和变量在继承时的覆盖和隐藏规则

  1.父类的实例变量和静态变量能被子类的同名变量隐藏

  2.父类的静态方法被子类的同名静态方法隐藏

  3.父类的实例方法被子类的同名实例变量覆盖

  还有几点需要注意的是

  1.不能用子类的静态方法隐藏 父类中同样标示(也就是返回值 名字 参数都一样)的实例方法

  2.不能用子类的实例方法覆盖 父类中同样标示的静态方法

  3.这点儿请注意,就是变量只会被隐藏 不会被覆盖 ,无论他是实例变量还是静态变量,而且,子类的静态变量可以隐藏 父类的实例变量,子类的实例变量可以隐藏
父类的静态变量

  创建两个父子类关系的类

  Java代码

  //父类

  class Parent

  {

  public static String kind="cn.com.farsight.parent";

  public static int age=50;

  public String name="Parent";

  //静态方法,返回包名

  public static String getKind()

  {

  System.out.println("parent的getKind()方法被调用了");

  return kind;

  }

  //静态方法,返回年龄

  public static int getAge()

  {

  System.out.println("Parent的getAge()方法被调用了");

  return age;

  }

  //实例方法,返回姓名

  public String getName()

  {

  System.out.println("Parent的getName()方法被调用了");

  return this.name;

  }

  }

  //子类

  class Child extends Parent

  {

  public static String kind="cn.com.farsight.child";

  public int age=25;

  public String name="child";

  //隐藏父类静态方法

  public static String getKind()

  {

  System.out.println("child的getkind()方法被调用了");

  return kind;

  }

  //获取父类包名

  public static String getParentKind()

  {

  return Parent.kind;

  }

  //覆盖父类实例方法

  public String getName()

  {

  System.out.println("child的getName()被调用了");

  return this.name;

  }

  //获取父类名称

  public String getParentName()

  {

  return super.name;

  }

  /*

  *错误,实例方法不能覆盖父类的静态方法

  public int getAge()

  {

  return this.age;

  }

  */

  }

  class TestDemo

  {

  public static void main(String[] args)

  {

  Child child=new Child();

  System.out.printf("子类名称:%s,年龄:%d,包名:%s%n",child.name,child.age,child.kind);

  //输出:子类名称:child,年龄:25,包:cn.com.farsight.child

  //把child转换成parent对象

  Parent parent=child;

  System.out.printf("转换后的名称:%s,年龄:%d,包名:%s%n",parent.name,parent.age,parent.kind);

  //输出:转换后的名称:Parent,年龄:50,包:cn.com.farsight.parent

  System.out.printf("子类访问父类被隐藏的实例变量name:%s%n",child.getParentName());

  //输出:子类访问父类被隐藏的实例变量name:Parent

  System.out.printf("子类访问父类被隐藏的静态变量kind:%s",child.getParentKind());

  //输出:子类访问父类被隐藏的静态变量kind:cn.com.farsight.parent

  child.getName();

  //输出:child的getName()被调用了

  //**************注意看这个方法,返回的还是子类的getName

  parent.getName();

  //输出:child的getName()被调用了

  child.getKind();

  //输出:child的getkind()方法被调用了

  parent.getKind();

  //输出:parent的getKind()方法被调用了

  }

  }

  总结:

  1.同名的实例方法被覆盖 ,同名的静态方法被隐藏 ,child类的getName实例方法覆盖
了parent的getName实例方法,chind的getKind方法隐藏了parent类的getKind方法

  2.隐藏和覆盖的区别在于,子类对象转换成父类对象后,能够访问父类被隐藏 的变量和方法,而不能访问父类被覆盖的方法

  3.如果需要访问父类被隐藏的实例变量,加上super就好了,比如访问父类name,使用super.name

 

  >>>更多优秀技术博文每日更新

时间: 2024-10-04 19:47:46

方法和变量在继承时的覆盖和隐藏问题的相关文章

方法和变量在继承时的覆盖和隐藏

package com.jdk7.chapter2.converhide; public class Parent { public static String kind = "com.jdk7.chapter2.Parent"; //类变量 public static int age = 100; //类变量 public String name = "Parent"; //实例变量 public static String getKind() { //静态方法

JAVA中方法和变量在继承中的覆盖和隐藏

我们知道,在JAVA中,子类可以继承父类,如果子类声明的方法与父类有重名的情况怎么办,大伙儿都知道要是重写,但是实际上这又分为两种情况,就是方法和变量在继承时的覆盖和隐藏问题. 隐藏 :child隐藏了parent的变量和方法,那么,child不能访问parent被隐藏的变量或者方法,但是,讲B转换成A中,可以访问A被隐藏的变量或者方法 覆盖 :child覆盖了parent的变量或者方法,那么,child不能访问parent被覆盖的变量或者方法,将child转换成parent后同样不能访问par

JAVA中方法和变量在继承中的覆盖和隐藏(一)

我们知道,在JAVA中,子类可以继承父类,如果子类声明的方法与父类有重名的情况怎么办,大伙儿都知道要是重写,但是实际上这又分为两种情况,就是方法和变量在继承时的覆盖和隐藏问题,这些概念性的东西看似无聊,但是在面试或者是SCJP认证题中围绕这些是会经常碰到的,所以这里来讨论下 首先我们来看几个概念 类变量:又叫静态变量,这种变量属于类,通过类名就可以访问类变量. 实例变量:属于类的实例,即对象,通过对象可以访问实例变量,但是不能通过类名访问实例变量. 静态方法:通过类名访问. 实例方法:对象访问,

Java中如何访问同名的方法或变量 ?

/* 类变量:又叫静态变量,这种变量属于类,通过类名就可以访问类变量. 实例变量:属于类的实例即对象,通过对象可以访问实例变量,但是不能通过类名访问实例变量. 静态方法:方法属于类,通过对象访问实例方法,不能通过类名访问实例方法. 隐藏:B隐藏了A的变量或者方法,那么,B不能访问A被隐藏的变量或方法,但是,将B转换成A后,可以访问A被隐藏的变量或方法. 覆盖:B覆盖了A的变量或者方法,那么,B不能够访问A被覆盖的变量或方法,将B转换成A后,同样不能访问A被覆盖的变量或方法. Java中方法和变量

关于继承时子类重写父类方法和覆盖父类变量的若干问题

假设,子类重载父类的方法,并将子类的成员覆盖. 创建子类对象实例,将其上转型成父类. 例子1 public class Parent { public void init() { System.out.println("1 init parent"); this.demo(); } public void demo() { System.out.println("2 demo parent"); } } public class Son extends Parent

java变量和方法的覆盖和隐藏(翻译自Java Tutorials)

隐藏变量 在一个类里,如果一个变量的名字和父类的变量的名字一样,即使他们的类型不一样,那么在子类中,父类的同名变量无法直接通过变量名访问.但是,父类的同名变量可以通过super访问.一般来说,不推荐隐藏变量,这样会让代码难以阅读 覆盖和隐藏方法 对象实例方法 在一个对象实例方法中,如果子类有一个方法,它的签名(方法名字,方法的参数个数和类型)和返回值都和父类一样,那么就是覆盖父类的方法.子类覆盖的能力,允许一个类,继承父类的行为,根据需要修改某些行为.覆盖的方法,和父类对应的方法有一样的名字,一

JAVA之旅(六)——单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖

JAVA之旅(六)--单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖 java也越来越深入了,大家加油吧!咱们一步步来 一.单例设计模式 什么是设计模式? JAVA当中有23种设计模式,解决某一问题最有效的方法 单例设计模式 解决一个类在内存中只存在一个对象 想要保证对象唯一该怎么做> 1.为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象 2.还为了让其他程序访问到该类对象,只好在本类中自定义一个对象 3.为了方便其他程序对自定义对象的访问,可以对外提供

java基础疑难点总结之成员变量的继承,方法重载与重写的区别,多态与动态绑定

1.成员变量的继承 1.1要点 子类用extends关键字继承父类.子类中可以提供新的方法覆盖父类中的方法.子类中的方法不能直接访问父类中的私有域,子类可以用super关键字调用父类中的方法.在子类中可以增加域,增加方法或者覆盖超类的方法,然而绝对不能删除继承的任何域和方法. 在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象.所以所谓的继承使子类拥有父类所有的属性和方法其实可以这样理解,子类对象确实拥有父类对象中所有的属性

C++父子类继承时的隐藏、覆盖、重载

存在父子类继承关系时,若有同名成员函数同时存在,会发生隐藏.覆盖和重载这几种情况.对于初学者也比较容易混淆,为此,我整理了一下我的个人看法,仅供参考.希望对大家理解有帮助,也欢迎指正. 1.父子类继承关系: 子类复制父类全部成员 首先,理解父子类的继承关系是怎样发生的.在此基础上就很容易理解它们之间的关系和区别. 每一个类有它自己的成员变量和成员函数,是一个独立的空间整体.当子类继承父类时,会将父类的全部成员全部复制一份,作为子类的成员,但是,同时也会标记这些成员是从父类中继承的,与子类本身的成