黑马程序员技术交流社区

标题: 写出程序运行结果——已解决 [打印本页]

作者: 王璐    时间: 2012-6-13 20:32
标题: 写出程序运行结果——已解决
本帖最后由 王璐 于 2012-6-15 08:29 编辑
  1. interface A
  2. {
  3. }
  4. class B implements A
  5. {
  6.         public String test()
  7.         {
  8.                 return "yes";
  9.         }
  10. }
  11. class Demo
  12. {
  13.         static A get()
  14.         {
  15.                 return new B();
  16.         }
  17.         public static void main(String[] args)
  18.         {
  19.                 A a=get();
  20.                 System.out.println(a.test());
  21.         }
  22. }
复制代码
一个例题,写出程序运行结果。其中static A get(){return new B();
}是什么意思?
作者: 伊文龙    时间: 2012-6-13 20:42
static A get(){return new B();
}是什么意思?

静态方法get(),返回值类型我A类,代码主体返回了一个B的对象。
作者: 何旭栋    时间: 2012-6-13 20:48
本帖最后由 何旭栋 于 2012-6-13 20:49 编辑

会报错吧,A接口中没有test()方法
static A get(){return new B()相当于:A a = new B();
作者: 王明明    时间: 2012-6-13 20:55
本帖最后由 王明明 于 2012-6-13 21:04 编辑
  1. interface A
  2. {
  3. }
  4. class B implements A
  5. {
  6.         public String test()
  7.         {
  8.                 return "yes";
  9.         }
  10. }
  11. class Demo
  12. {
  13.         static A get()
  14.         {
  15.                 return new B();
  16.         }
  17.         public static void main(String[] args)
  18.         {
  19.                 A a=get();
  20.                 System.out.println(a.test());//编译失败,因为A接口中并未定义test()方法
  21.         }
  22. }
复制代码
你可以这样给接口增加一个方法
  1. interface A
  2. {
  3. String test();
  4. }
  5. class B implements A
  6. {
  7. public String test()
  8. {
  9. return "yes";
  10. }
  11. }
  12. class Demo
  13. {
  14. static A get()
  15. {
  16. return new B();
  17. }
  18. public static void main(String[] args)
  19. {
  20. A a=get();
  21. System.out.println(a.test());
  22. }
  23. }
复制代码

作者: 黄连兵    时间: 2012-6-13 20:57
A接口中没有申明任何方法,System.out.println(a.test());语句中a.test()是没法通过编译的啊~!
修改成如下代码:运行结果是:yes
其中static A get(){return new B();
定义了一个get方法,首先返回一个B类实例对象,再将其类型提升为A接口。最终获得的是一个A接口。
  1. package com.practise;

  2. interface A {
  3.         public String test();
  4. }

  5. class B implements A {
  6.         public String test() {
  7.                 return "yes";
  8.         }
  9. }

  10. public class Demo {
  11.         static A get() {
  12.                 return new B();
  13.         }

  14.         public static void main(String[] args) {
  15.                 A a = get();
  16.                 System.out.println(a.test());
  17.         }
  18. }
复制代码

作者: 梁清平    时间: 2012-6-13 20:58
static A get()
{
            return new B();
}
这个方法的意思是:返回值是接口A类型,这里返回的实现了接口A的子类B的实例。

这段代码是有错误的。。错误如下:
A a=get();
System.out.println(a.test());
这两句相当于  A a = new B();
a是接口A类型的,上面的这一句是没问题的,但是这里的a是不能调用test()方法的。

test()方法是类B的,这里并不够成多态,要知道够成多态的前提有三:继承、重写、父类指向子类。

但是这里并没有重写。。所以不够成多态,接口A中并没有test()方法。。故是错误的!!!
作者: 乐峰    时间: 2012-6-13 21:00
程序会报错:
A a=get();相当于A a=new B();
a.test();这里会出现错误,原因是:A类的类变量a指向其子类B的对象,在编译过程中都要看表达式的左边,左半部分的表达式是A类型的变量,可是test()方法在A类中没有定义。是子类B的特有方法,所以A类型的类变量不能调用test()这个方法。
作者: 邓杰    时间: 2012-6-13 21:07
好好看毕老师的视频吧;这是最基本的东西了;
B implements A\\表示B类实现了A接口;
public String test()
{
  return "yes"; 表示test是B类的一个特有方法;返回值类型为String 返回值为“yes”;
}
static A get()
{
   return new B();// 返回值类型为A类型的方法; 返回值为B对象;因为B实现了A接口;所以此处正确;
}
A a=get(); A为基类原理同上。所以此处也可以用A来增收B类对象;
a.test()//注意:此处的a是A类型的。而A类型是一个接口;test是B类的特有方法;用A 类的a去调用B类的特有方法肯定是什么报错的;所以结果是不能编译不能通过
因此要想通过编译;就要向下转型 A a=get()改为B a=(B)get();





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