interface A{}
class B implements A
{
public String test()
{
return "yes";
}
}
class Demo
{
static A get()
{
return new B();
}
public static void main(String[] args)
{
A a=get();
System.out.println(a.test());
}
}
打印结果是:编译失败,因为A接口中没有定义test方法。
这是毕老师的一个小练习题,谁能和我解释下A a=get();这句话的A是哪里的A?是接口的,还是static A get()我理解不到
作者: HM刘博 时间: 2013-3-15 14:20
interface A{}
class B implements A
{
public String test()
{
return "yes";
}
}
class Demo
{
static A get()
{
return new B();
}
public static void main(String[] args)
{
A a=get();
System.out.println(a.test());
}
}
复制代码
A a=get();这句话执行,就会执行
static A get()
{
return new B();
}
这就相当于A a=new B();
这就是多态。
在编译的时候看等号的左边,因为类A中没有方法test,方法test时类B中特有的,所以编译失败。
HM刘博 发表于 2013-3-15 14:20
A a=get();这句话执行,就会执行
static A get()
{
为什么A a=get();这句话执行,
就会执行
static A get()
{
return new B();
}
我就是对这句话理解不出来。新手,能解释的详细点吗?作者: HM刘博 时间: 2013-3-15 14:38
郑元皓 发表于 2013-3-15 14:33
为什么A a=get();这句话执行,
就会执行
static A get()
这就是调用啊作者: 郑元皓 时间: 2013-3-15 14:46
HM刘博 发表于 2013-3-15 14:38
这就是调用啊
嗯嗯。理解出来了。谢谢作者: HM刘博 时间: 2013-3-15 14:48
郑元皓 发表于 2013-3-15 14:46
嗯嗯。理解出来了。谢谢
不客气,共同努力作者: itserious 时间: 2013-3-15 14:51
interface A{}
class B implements A
{
public String test()
{
return "yes";
}
}
class Demo
{
static A get()
{
return new B();
}
public static void main(String[] args)
{
A a=get(); //多态;实现了父类引用指向子类对象。
//上面这句话等同:A a =new B(); 实现了父类引用指向子类对象。
//现在把方法get()的反回值 new B() ,B的一个实例看作成一个A的对象来用。
//例如:将一个猎人当作一个普通人来看了。 其中,A为猎人,B为普通人,
System.out.println(a.test());//既然将猎人只当一个普通人来看,那么他就不会有猎人才具备的打猎方法了。其中将test()看做猎人的打猎方法。
//因为A中没有test()方法,所以a.test()编译错误。
//如果你将 A a=get(); 改成 B a=(B) get(); ,就可以调用a.test()方法了。
}
}
首先明确一点,你的编译失败是因为多态的问题。
1,static A get()//这是一个方法,方法被静态修饰,方法的返回值类型是接口类型A
{
return new B();
}
2,public static void main(String[] args)
{
A a=get();//这个是多态的体现,你使用接口A类型引用接收A的子类对象
System.out.println(a.test());//使用父类引用调用test()方法,但是你父接口A中有test方法吗?没有,所以你会编译失败。这种情况就是你父类引用接收子类对象且调用子类特有的方法
//这时候若想要编译通过,必须向下转型,回复子类本来的面貌 就是 B b=(B)a;然后再用b调用test方法就行了
}
改正后的代码如下,供您参考:
<DIV class=blockcode>
<BLOCKQUOTE>
<BLOCKQUOTE> [code]
interface A{}
class B implements A
{
public String test()
{
return "yes";
}
}
class Demo
{
static A get()
{
return new B();
}
public static void main(String[] args)
{
A a=get();
B b=(B)a;
System.out.println(b.test());
}
}
复制代码
[/code] 作者: 洪建超 时间: 2013-3-15 16:14
csatshell 发表于 2013-3-15 15:07
首先明确一点,你的编译失败是因为多态的问题。
1,static A get()//这是一个方法,方法被静态修饰,方法的 ...