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

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

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


百度了很久

除了说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的最初设计意图之一。 

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

唯一可以调用父类方法的地方,就只有类内部。子类自己控制,什么时候该调用父类,什么时候做自己的处理。





想到最后才发现自己为啥会纠结这么一个问题=。=
方法被覆盖自然是需要修改
既然修改了为什么还要想着去调用父类中的方法
真是多此一举

  • 24
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值