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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王璐 中级黑马   /  2012-6-13 20:32  /  2041 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王璐 于 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();
}是什么意思?

评分

参与人数 1技术分 +1 收起 理由
赵志勇 + 1

查看全部评分

7 个回复

倒序浏览
static A get(){return new B();
}是什么意思?

静态方法get(),返回值类型我A类,代码主体返回了一个B的对象。
回复 使用道具 举报
本帖最后由 何旭栋 于 2012-6-13 20:49 编辑

会报错吧,A接口中没有test()方法
static A get(){return new B()相当于:A a = new B();
回复 使用道具 举报
本帖最后由 王明明 于 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. }
复制代码
回复 使用道具 举报
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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
赵志勇 + 1

查看全部评分

回复 使用道具 举报
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:34
7#
程序会报错:
A a=get();相当于A a=new B();
a.test();这里会出现错误,原因是:A类的类变量a指向其子类B的对象,在编译过程中都要看表达式的左边,左半部分的表达式是A类型的变量,可是test()方法在A类中没有定义。是子类B的特有方法,所以A类型的类变量不能调用test()这个方法。
回复 使用道具 举报
邓杰 中级黑马 2012-6-13 21:07:01
8#
好好看毕老师的视频吧;这是最基本的东西了;
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();

评分

参与人数 2技术分 +1 黑马币 +20 收起 理由
王璐 + 20 赞一个!
赵志勇 + 1 赞一个!

查看全部评分

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