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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 乔九 中级黑马   /  2012-10-17 07:56  /  2017 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

interface Contents
{
         void go();
}

public class Test1 {
         public Contents con()
         {
                 return new Contents()
                 {
                         public void go()
                         {
                                 System.out.println("I got it");
                         }
                 };
         }
         
        public static void main(String [] args)
         {
                 Test1 t = new Test1();
                 Contents c = t.con();
                 c.go();
         }
代码中定义了一个接口在类Test1中并没有用关键字实现怎么可以创建接口对象并复写接口?
还在主函数中利用多态调用?

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1 神马都是浮云

查看全部评分

5 个回复

倒序浏览
public Contents con() 方法返回了一个Contents对象,
所以“Contents c = t.con();”就是相当于“Contents c = new Contents();”是创建了Contents对象。这里的t.con()是调用Test1中的con()方法,不是多态。
所以变量c指向了一个Contents对象,可以进行go()方法的调用。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  1. interface Contents
  2. {
  3.          void go();
  4. }

  5. public class Test1 {
  6.          public Contents con()
  7.          {
  8.                  //楼主可以这样看,con()返回一个Contents型实例对象,并且这个实例对象实现了void go()方法所以它可以被调用
  9.                  return new Contents() { public void go(){ System.out.println("I got it");}};
  10.          }
  11.             
  12.                
  13.          
  14.          
  15.         public static void main(String [] args)
  16.          {
  17.                  Test1 t = new Test1();  //创建Test1型的实例对象t
  18.                  Contents c = t.con(); //对象t可以调用con()并返回一个非抽象的Contents型的对象
  19.                  c.go();  //因为c 中的go方法是非抽象的,所以可以调用
  20.          }
  21. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
1.匿名内部类你还不是很熟
new Contents()
                 {
                         public void go()
                         {
                                 System.out.println("I got it");
                         }
                 };
单拿出来分析:这部分代码是说创建了一个子类的实现类的对象重写接口中的方法,是多态的体现,只不过用匿名内部类这种写法看起来比较拧巴;

2.              Test1 t = new Test1();
                 Contents c = t.con();
                 c.go();
第一行是说声明一个引用并创建一个Test1对象
第二行就是很简单的调用,只不过返回值是Contents 类型的对象
第三行就是利用创建好的实现类对象调用他重写的方法

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1 赞一个!

查看全部评分

回复 使用道具 举报
就是匿名内部类的问题。建议你再复习下。该说的。LS都说了
回复 使用道具 举报
其实你这段代码
return new Contents()
                 {
                         public void go()
                         {
                                 System.out.println("I got it");
                         }
                 };
就等于是创建了一个新的对象实现了Contents接口,然后重写了接口里的方法
再到main方法里Contents c = t.con();就等于父类引用指向子类对象,多态的存在了
所以c.go()访问的就是上面返回的对象里重写的方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马