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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 我能学编程吗 于 2013-10-30 14:01 编辑

如下代码:父类的方法被覆盖后,父类就没有办法调用自己的方法了吗?而在子类中才可以调用父类的方法,如下代码。怎样在父类中调用被覆盖的方法呢?可以吗?
  1. public class JavaDemo {

  2.         public static void main(String[] args) throws Exception {
  3.                 new Zi();
  4.         }
  5. }

  6. class Fu {

  7.         public Fu() {
  8.                 this.fun();        // 调用的是子类的方法
  9.         }

  10.         void fun() {
  11.                 System.out.println("Fu");
  12.         }
  13. }

  14. class Zi extends Fu {

  15.         public Zi() {
  16.                 super();
  17.         }

  18.         void fun() {
  19.                 super.fun();// 调用的是父类的方法
  20.                 System.out.println("Zi");
  21.         }
  22. }
复制代码
输出结果:
Fu
Zi

评分

参与人数 1技术分 +1 收起 理由
To + 1 很给力!

查看全部评分

6 个回复

倒序浏览
new Fu() 的话可以
被重写的方法应该不能被子类调用吧,
回复 使用道具 举报
有办法,new一个父类对象就行了。还有输出结果是是fu  zi
是因为子类继承了父类,在创建一个一个新的子类对象是,子类会先调用父类的构造方法(若子类构造方法中没有显示的调用父类构造方法,则会调用子类的无参构造方法,所以此时要确保父类要有一个无参构造方法,否则会编译出错。若显示的调用了父类的构造方法,则调用指定构造方法),本代码中new Zi();在执行子类构造方法中,显示的调用了父类的构造方法,既super();super();中无参数,即调用父类中对应的public Fu() {  this.fun();  },此时this代表子类的一个对象,所以会调用子类的fun()方法。而子类中的fun()方法中复写了父类的fun()方法,其中super()是保留了父类的fun方法中的功能。子类的fun方法相当与:
void fun() {
                System.out.println("Fu");
                System.out.println("Zi");
        }
所以输出结果是
fu
zi

评分

参与人数 1技术分 +1 收起 理由
To + 1 很给力!

查看全部评分

回复 使用道具 举报
其实是很懂楼主问的问题,父类不能调用父类的方法,是怎样调呢?
1.用父类new的对象,肯定可以调用
2.用子类new对象赋给父类,除在子类内部外,外面是无法直接调用的,因为父类中引用的是子类的对象,所以无法直接通过子类调用,但是在子类中是可以的
我先分析一下这段代码:
起初乍一看代码,肯定是认为输出的肯定是Fu,但是事实却不是如此
其实问题出在this上,《疯狂Java讲义》中说道:当this在构造器中,this代表正在初始化的java对象
所以父类构造器中this.fun(),调用的是子类中的fun()方法,输出fu zi

希望对楼主有用,错误之处,大家多多指正

评分

参与人数 1技术分 +1 收起 理由
To + 1 赞一个!

查看全部评分

回复 使用道具 举报
To 金牌黑马 2013-10-30 00:10:02
报纸
楼主你好,如果问题已解决请将帖子状态修改为提问结束,
如果未解决请继续追问,谢谢合作
修改方法请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
雨过丶天已晴 发表于 2013-10-29 21:22
其实是很懂楼主问的问题,父类不能调用父类的方法,是怎样调呢?
1.用父类new的对象,肯定可以调用
2.用子 ...

您说的“this代表下在初始化的Java对象”,您意思是说我上面代码中Fu类中的this代表的是Zi这个对象吗?如果是这样的话我可不认同。如下代码证明我不认同的观点:
  1. class Fu {
  2.         int x = 10;

  3.         public Fu() {
  4.                 System.out.println(this.x);        // 打印的是父类的x = 10
  5.         }

  6. }

  7. class Zi extends Fu {
  8.         int x = 5;
  9.        
  10.         public static void main(String[] args) throws Exception {
  11.                 new Zi();
  12.         }
  13. }
复制代码
回复 使用道具 举报
王东 中级黑马 2013-10-30 21:37:51
7#
可以建立父类的对象调用父类的方法,但是建立子类只能调用重写之后的方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马