java 通过子类怎么调用父类已经被重写的方法

来源:互联网 发布:qq变声软件 编辑:程序博客网 时间:2024/05/21 02:50

= =今天看书看到覆盖和重载

我就在想能不能再实例化的子类中调用父类已经被覆盖的方法


百度了很久

除了说super  貌似就不行了

 


也能在子类中做一个新方法来调用父类已经被覆盖的方法  

例如:

import java.io.BufferedReader;public class baidu extends Search {public static void main(String[] args) throws IOException {new baidu().superFunction() ;}public void function(){System.out.println("I am baidu!");}public void superFunction(){super.function() ;}}class Search{public void function(){System.out.println("I am search!");}}

也有人说

A为父类,B为子类,都有一个m()方法

B b = new B();

想通过((A)b).m()

来调用

实际上也是不行的 

详见见识:

B b=new B(); 这种方式,实际上是实例化了子类的对象,注意:内存中还是子类对象。((A)b).m();  表面上看起来是父类对象了,但是由于内存中是子类对象,所以调用的还是子类方法。A b=new B(); b.m(); 这种方法和你写的实际是一个效果,虽然上溯造型到了父类,由于子类重写了父类的方法,调用的还是子类的方法(也就是所:方法的实现,最后是在子类中实现的)。所以,总结如下:如果子类没有重写父类的方法,调用父类的方法的时候,实际上是去父类的内存中实现,可以调用父类方法。如果子类重写了父类的方法,那么,你虽然上溯造型到了父类,由于内存还是子类,该方法的实现还是在子类,所以用实例化的对象是调用不到父类的,这种情况下,只能用super关键字。
综上 
如果不是类内部,而是外部调用,比如你例子中的main方法,答案是 

不能。你不能调用已经被覆盖掉的父类的方法。 

这也是覆盖override的最初设计意图之一。 

大多数时候,覆盖父类意味着子类想做些特殊的处理。如果能够跳过子类的特殊处理,就会打开一个无法控制的缺口,会导致很多很多问题。 

唯一可以调用父类方法的地方,就只有类内部。子类自己控制,什么时候该调用父类,什么时候做自己的处理。
想到最后才发现自己为啥会纠结这么一个问题=。=
方法被覆盖自然是需要修改
既然修改了为什么还要想着去调用父类中的方法
真是多此一举