黑马程序员技术交流社区
标题:
方法覆盖后,父类就不能调用自己的方法了吗
[打印本页]
作者:
我能学编程吗
时间:
2013-10-29 19:52
标题:
方法覆盖后,父类就不能调用自己的方法了吗
本帖最后由 我能学编程吗 于 2013-10-30 14:01 编辑
如下代码:父类的方法被覆盖后,父类就没有办法调用自己的方法了吗?而在子类中才可以调用父类的方法,如下代码。怎样在父类中调用被覆盖的方法呢?可以吗?
public class JavaDemo {
public static void main(String[] args) throws Exception {
new Zi();
}
}
class Fu {
public Fu() {
this.fun(); // 调用的是子类的方法
}
void fun() {
System.out.println("Fu");
}
}
class Zi extends Fu {
public Zi() {
super();
}
void fun() {
super.fun();// 调用的是父类的方法
System.out.println("Zi");
}
}
复制代码
输出结果:
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这个对象吗?如果是这样的话我可不认同。如下代码证明我不认同的观点:
class Fu {
int x = 10;
public Fu() {
System.out.println(this.x); // 打印的是父类的x = 10
}
}
class Zi extends Fu {
int x = 5;
public static void main(String[] args) throws Exception {
new Zi();
}
}
复制代码
作者:
王东
时间:
2013-10-30 21:37
可以建立父类的对象调用父类的方法,但是建立子类只能调用重写之后的方法
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2