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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 牵手相伴 中级黑马   /  2014-6-19 20:17  /  1999 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

intrface A{}
class B implements A{
  public String func(){
return "func";
}
}
class Demo
{
public static void main(String[] args){
A a=new B();
System.out.println(a.func());
}
}
因为A接口中并未定义func方法,所以编译失败
class Fu
{
boolean show(char a){
System.out.println(a);
return true;
}
}
class Demo extends Fu{
public static void main(String[] args){
int i=0;
Fu f=new Demo();
Demo d=new();
for(f.show('A');f.show('B')&&(i<2);f.show('C'))
{
i++;
d.show('D');
}
}
boolean show(char a){
System.out.println(a);
return false
}
}

输出A B
我想问的是为啥上面的那个程序a.func()就调用的是父类的方法,下面这个f.show()调用的却是子类的方法

8 个回复

倒序浏览
A a = new B();
Fu f = new Demo();
其中a,f都是子类实例化的对象向上转型得到,所以调用的都会是被子类覆写的方法。但是此时需注意,对象a是无法调用B类中的方法func()的,因为此方法只在子类中定义,而没有在父类中定义。如果一定要用,需要将a进行向下转型。
回复 使用道具 举报
因为你的A是个接口,里面没有fun方法,你调用fun方法肯定报错,f因为他实质是Demo类,当然调用Demo的fun方法啦
回复 使用道具 举报
心者觉也 发表于 2014-6-19 23:26
A a = new B();
Fu f = new Demo();
其中a,f都是子类实例化的对象向上转型得到,所以调用的都会是被子类覆 ...

那为什么f就可以调用子类Demo中的方法呢
回复 使用道具 举报
Без_тебя 发表于 2014-6-20 00:03
因为你的A是个接口,里面没有fun方法,你调用fun方法肯定报错,f因为他实质是Demo类,当然调用Demo的fun方 ...

f的实质不应该是Fu类吗?不是应该和a是一样的代表的时候父类吗
回复 使用道具 举报
牵手相伴 发表于 2014-6-20 09:11
那为什么f就可以调用子类Demo中的方法呢

因为Fu和Demo都有这个方法,子类的实例化对象向上转型后依然保留其覆写的父类方法。
A接口没有func()方法,子类实例化向上转型会舍弃父类所没有的方法。
回复 使用道具 举报
牵手相伴 发表于 2014-6-20 09:12
f的实质不应该是Fu类吗?不是应该和a是一样的代表的时候父类吗

f的实质是看右边的~~左边是引用~~,你可以这么想,f的实质是右边的类,左边是Fu类,Fu中有调用fun()方法的引用,同样可以调用Demo的fun()方法
回复 使用道具 举报
我是main 来自手机 中级黑马 2014-6-20 14:01:06
8#
接口中没有的方法又怎么能通过接口调用它实现类的方法呢,继承类中既然已经重写了父类的方法,那就只能调用重写后的方法,除非你用super
回复 使用道具 举报
Без_тебя 发表于 2014-6-20 12:56
f的实质是看右边的~~左边是引用~~,你可以这么想,f的实质是右边的类,左边是Fu类,Fu中有调用fun()方法 ...

恩恩清楚了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马