A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 禾呈 中级黑马   /  2013-5-26 22:34  /  1405 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

子类覆写父类的方法时,子类中的这个方法要比父类中这个方法权限大?这是为什么?


父类的静态方法只能用静态方法覆写,父类中的一半方法却不可以用静态覆写,这有是为啥啊?


求高手解答啊?

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

1 个回复

倒序浏览
重写也叫覆写,修饰符、返回类型、参数就是要和父类一摸一样才叫覆写,意思是说各个地方都需要完美的盖住,在面向接口编程中,重写是子类有自己的逻辑要实现,同时又不破坏已写好程序逻辑的好方法 。
举个例子,在父类中是public的方法,如果子类中将其降低访问权限为private,那么子类中重写以后的方法对于外部对象就不可访问了,这个就破坏了继承的含义。
"重写"只能适用于实例方法.不能用于静态方法.对于静态方法,只能隐藏(形式上被重写了,但是不符合的多态的特性),“重写”是用来实现多态性的,只有实例方法是可以实现多态,而静态方法无法实现多态。例如:

        Employee man = new Manager();

        man.test();
   实例化的这个对象中,声明的man变量是Employee类的,变量名存在栈中,而内存堆中为对象申请的空间却是按照Manager类来的,就是Employee类型的man变量的指针指向了一个Manager类的对象。如果对这个man调用方法,调用的是谁的?如果是非静态方法,编译时编译器以为是要调用Employee类的,可是实际运行时,解释器就从堆上开工了,实际上是从Manager类的那个对象上走的,所以调用的方法实际上是Manager类的方法。有这种结果关键在于man实际上指向了Manager类对象。现在用man来调用静态方法,实际上此时是Employee类在调用静态方法,Employee类本身肯定不会指向Manager类的对象,那么最终调用的是Employee类的方法。

   由此,只能说形式上静态方法的却可以被重写,实际上达不到重写的效果,从多态的角度可以认为子类实际上是写了一个新方法,从这个角度上说静态方法无法被重写。那么也就证明了重写和覆盖就是一回事。

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马