= =今天看书看到覆盖和重载
我就在想能不能再实例化的子类中调用父类已经被覆盖的方法
百度了很久
除了说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的最初设计意图之一。
大多数时候,覆盖父类意味着子类想做些特殊的处理。如果能够跳过子类的特殊处理,就会打开一个无法控制的缺口,会导致很多很多问题。
唯一可以调用父类方法的地方,就只有类内部。子类自己控制,什么时候该调用父类,什么时候做自己的处理。
想到最后才发现自己为啥会纠结这么一个问题=。=
方法被覆盖自然是需要修改
既然修改了为什么还要想着去调用父类中的方法
真是多此一举