黑马程序员技术交流社区

标题: 方法覆盖后,父类就不能调用自己的方法了吗 [打印本页]

作者: 我能学编程吗    时间: 2013-10-29 19:52
标题: 方法覆盖后,父类就不能调用自己的方法了吗
本帖最后由 我能学编程吗 于 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


作者: 零下五度的水    时间: 2013-10-29 20:10
new Fu() 的话可以
被重写的方法应该不能被子类调用吧,
作者: 烟花雨    时间: 2013-10-29 21:21
有办法,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
作者: 雨过丶天已晴    时间: 2013-10-29 21:22
其实是很懂楼主问的问题,父类不能调用父类的方法,是怎样调呢?
1.用父类new的对象,肯定可以调用
2.用子类new对象赋给父类,除在子类内部外,外面是无法直接调用的,因为父类中引用的是子类的对象,所以无法直接通过子类调用,但是在子类中是可以的
我先分析一下这段代码:
起初乍一看代码,肯定是认为输出的肯定是Fu,但是事实却不是如此
其实问题出在this上,《疯狂Java讲义》中说道:当this在构造器中,this代表正在初始化的java对象
所以父类构造器中this.fun(),调用的是子类中的fun()方法,输出fu zi

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

作者: To    时间: 2013-10-30 00:10
楼主你好,如果问题已解决请将帖子状态修改为提问结束,
如果未解决请继续追问,谢谢合作
修改方法请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html
作者: 我能学编程吗    时间: 2013-10-30 13:59
雨过丶天已晴 发表于 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
可以建立父类的对象调用父类的方法,但是建立子类只能调用重写之后的方法




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2