黑马程序员技术交流社区

标题: 求学的仔细的给解答解答 [打印本页]

作者: 牵手相伴    时间: 2014-6-19 20:17
标题: 求学的仔细的给解答解答
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()调用的却是子类的方法


作者: 心者觉也    时间: 2014-6-19 23:26
A a = new B();
Fu f = new Demo();
其中a,f都是子类实例化的对象向上转型得到,所以调用的都会是被子类覆写的方法。但是此时需注意,对象a是无法调用B类中的方法func()的,因为此方法只在子类中定义,而没有在父类中定义。如果一定要用,需要将a进行向下转型。

作者: Без_тебя    时间: 2014-6-20 00:03
因为你的A是个接口,里面没有fun方法,你调用fun方法肯定报错,f因为他实质是Demo类,当然调用Demo的fun方法啦
作者: 牵手相伴    时间: 2014-6-20 09:11
心者觉也 发表于 2014-6-19 23:26
A a = new B();
Fu f = new Demo();
其中a,f都是子类实例化的对象向上转型得到,所以调用的都会是被子类覆 ...

那为什么f就可以调用子类Demo中的方法呢
作者: 牵手相伴    时间: 2014-6-20 09:12
Без_тебя 发表于 2014-6-20 00:03
因为你的A是个接口,里面没有fun方法,你调用fun方法肯定报错,f因为他实质是Demo类,当然调用Demo的fun方 ...

f的实质不应该是Fu类吗?不是应该和a是一样的代表的时候父类吗
作者: 心者觉也    时间: 2014-6-20 09:30
牵手相伴 发表于 2014-6-20 09:11
那为什么f就可以调用子类Demo中的方法呢

因为Fu和Demo都有这个方法,子类的实例化对象向上转型后依然保留其覆写的父类方法。
A接口没有func()方法,子类实例化向上转型会舍弃父类所没有的方法。
作者: Без_тебя    时间: 2014-6-20 12:56
牵手相伴 发表于 2014-6-20 09:12
f的实质不应该是Fu类吗?不是应该和a是一样的代表的时候父类吗

f的实质是看右边的~~左边是引用~~,你可以这么想,f的实质是右边的类,左边是Fu类,Fu中有调用fun()方法的引用,同样可以调用Demo的fun()方法
作者: 我是main    时间: 2014-6-20 14:01
接口中没有的方法又怎么能通过接口调用它实现类的方法呢,继承类中既然已经重写了父类的方法,那就只能调用重写后的方法,除非你用super
作者: 牵手相伴    时间: 2014-6-20 17:37
Без_тебя 发表于 2014-6-20 12:56
f的实质是看右边的~~左边是引用~~,你可以这么想,f的实质是右边的类,左边是Fu类,Fu中有调用fun()方法 ...

恩恩清楚了




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